finite_machine 0.11.2 → 0.11.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 75abd57820e49c51d189b0a338477694f8ec7059
4
- data.tar.gz: 5d983ca01af05a88d06626a2cd9f27207c87ad0d
3
+ metadata.gz: 64b466f571e5b537fe1836ce548cc742ffee4dfc
4
+ data.tar.gz: fbbc424571e422139ca7896cfd2465023ddab2ca
5
5
  SHA512:
6
- metadata.gz: ecd18ac6229dd4293ef77c02f8390f1ad012840680526ff434a72b6dedb107fb85c237cdf028ef0c24574a376041becebeb49b0312ccf1a09a1307aafc74026e
7
- data.tar.gz: de118ce61f3dce393546528420918b6d042b298f0c54a7d92baa853e54763e685e6deadc143954b6e894d004e4a8458f8ff1f23113f646c3a0bbf6009f52438b
6
+ metadata.gz: aa9c41cfd27257a3ae5f896bf00fd582ad5586e2e064632c93490173800c85fd6b9bb033a2d0ac5c10850b1ad86b12f79419e425f74497656a40bf85425332f4
7
+ data.tar.gz: 635d68e625689ac0b0c7adbdf04d50e6abf7c8f000d67e4e263d498693f7fb44d8b55f72dc79e6cb026189fc9a3b6a97f584add2b7e6154bf96afb24c92bae62
data/.travis.yml CHANGED
@@ -9,6 +9,7 @@ rvm:
9
9
  - 2.0
10
10
  - 2.1
11
11
  - 2.2
12
+ - 2.3.0
12
13
  - ruby-head
13
14
  - rbx-2
14
15
  matrix:
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Change Log
2
2
 
3
+ ## [v0.11.3] - 2016-03-04
4
+
5
+ ### Added
6
+ * Add performance tests & memory usage benchmarks
7
+
8
+ ### Changed
9
+ * Change EventQueue to MessageQueue for handling generic asynchronous messages
10
+ * Split async behaviour to use CallbackQueue for observed callbacks and EventQueue for async event triggers.
11
+ * Change AsyncProxy and Observer to lazy load message queue
12
+
13
+ ### Fixed
14
+ * Fix memory leak - issue #42 with help from @craiglittle
15
+
3
16
  ## [v0.11.2] - 2015-12-30
4
17
 
5
18
  ### Added
@@ -237,6 +250,7 @@
237
250
  ### Fixed
238
251
  * Fix bug - callback event object returns correct from state
239
252
 
253
+ [v0.11.3]: https://github.com/peter-murach/finite_machine/compare/v0.11.2...v0.11.3
240
254
  [v0.11.2]: https://github.com/peter-murach/finite_machine/compare/v0.11.1...v0.11.2
241
255
  [v0.11.1]: https://github.com/peter-murach/finite_machine/compare/v0.11.0...v0.11.1
242
256
  [v0.11.0]: https://github.com/peter-murach/finite_machine/compare/v0.10.2...v0.11.0
data/Gemfile CHANGED
@@ -5,6 +5,7 @@ gemspec
5
5
  group :development do
6
6
  gem 'pry', '~> 0.10.1'
7
7
  gem 'rspec', '~> 3.4.0'
8
+ gem 'rspec-benchmark', '~> 0.1.0'
8
9
  gem 'yard', '~> 0.8.7'
9
10
  end
10
11
 
data/README.md CHANGED
@@ -559,6 +559,7 @@ fm = FiniteMachine.define do
559
559
  :low => :medium,
560
560
  :medium => :high
561
561
  }
562
+ end
562
563
  ```
563
564
 
564
565
  The same can be more naturally rewritten also as:
@@ -572,6 +573,7 @@ fm = FiniteMachine.define do
572
573
  event :bump, :low => :medium
573
574
  event :bump, :medium => :high
574
575
  }
576
+ end
575
577
  ```
576
578
 
577
579
  ### 2.7 Silent transitions
@@ -1441,4 +1443,4 @@ Creating a standalone **FiniteMachine** brings a number of benefits, one of them
1441
1443
 
1442
1444
  ## Copyright
1443
1445
 
1444
- Copyright (c) 2014-2015 Piotr Murach. See LICENSE for further details.
1446
+ Copyright (c) 2014-2016 Piotr Murach. See LICENSE for further details.
data/Rakefile CHANGED
@@ -5,4 +5,4 @@ require "bundler/gem_tasks"
5
5
  FileList['tasks/**/*.rake'].each(&method(:import))
6
6
 
7
7
  desc 'Run all specs'
8
- task ci: %w[ spec ]
8
+ task ci: %w[ spec spec:perf ]
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ require 'finite_machine'
4
+
5
+ 3.times do
6
+ puts
7
+
8
+ GC.start
9
+
10
+ before = GC.stat
11
+ p ObjectSpace.count_objects
12
+
13
+ 1_000.times do
14
+ FiniteMachine.define
15
+ end
16
+
17
+ p ObjectSpace.count_objects
18
+ after = GC.stat
19
+
20
+ p "GC count: #{after[:count] - before[:count]}"
21
+ end
@@ -18,6 +18,6 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler"
22
- spec.add_development_dependency "rake"
21
+ spec.add_development_dependency 'bundler', '>= 1.5.0', '< 2.0'
22
+ spec.add_development_dependency 'rake'
23
23
  end
@@ -15,7 +15,7 @@ require "finite_machine/async_proxy"
15
15
  require "finite_machine/async_call"
16
16
  require "finite_machine/hook_event"
17
17
  require "finite_machine/env"
18
- require "finite_machine/event_queue"
18
+ require "finite_machine/message_queue"
19
19
  require "finite_machine/events_chain"
20
20
  require "finite_machine/logger"
21
21
  require "finite_machine/transition"
@@ -66,7 +66,7 @@ module FiniteMachine
66
66
  MissingInitialStateError = Class.new(::StandardError)
67
67
 
68
68
  # Raised when event queue is already dead
69
- EventQueueDeadError = Class.new(::StandardError)
69
+ MessageQueueDeadError = Class.new(::StandardError)
70
70
 
71
71
  # Raised when argument is already defined
72
72
  AlreadyDefinedError = Class.new(::ArgumentError)
@@ -2,11 +2,20 @@
2
2
 
3
3
  module FiniteMachine
4
4
  # An asynchronous messages proxy
5
+ #
6
+ # @api private
5
7
  class AsyncProxy
6
8
  include Threadable
7
9
 
8
10
  attr_threadsafe :context
9
11
 
12
+ # The queue for asynchronoous events
13
+ #
14
+ # @return [EventQueue]
15
+ #
16
+ # @api private
17
+ attr_threadsafe :event_queue
18
+
10
19
  # Initialize an AsynxProxy
11
20
  #
12
21
  # @param [Object] context
@@ -14,7 +23,10 @@ module FiniteMachine
14
23
  #
15
24
  # @api private
16
25
  def initialize(context)
17
- self.context = context
26
+ self.context = context
27
+ self.event_queue = MessageQueue.new
28
+
29
+ ObjectSpace.define_finalizer(self, self.class.cleanup(event_queue))
18
30
  end
19
31
 
20
32
  # Delegate asynchronous event to event queue
@@ -24,7 +36,20 @@ module FiniteMachine
24
36
  callable = Callable.new(method_name)
25
37
  async_call = AsyncCall.new(context, callable, *args, &block)
26
38
 
39
+ event_queue.start unless event_queue.running?
27
40
  context.event_queue << async_call
28
41
  end
42
+
43
+ # Clean up event queue
44
+ #
45
+ # @api private
46
+ def self.cleanup(queue)
47
+ proc do
48
+ begin
49
+ queue && queue.shutdown
50
+ rescue MessageQueueDeadError
51
+ end
52
+ end
53
+ end
29
54
  end # AsyncProxy
30
55
  end # FiniteMachine
@@ -1,26 +1,44 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module FiniteMachine
4
- # A class responsible for running asynchronous events
5
- class EventQueue
4
+ # Allows for storage of asynchronous messages such as events
5
+ # and callbacks.
6
+ #
7
+ # Used internally by {Observer} and {StateMachine}
8
+ #
9
+ # @api private
10
+ class MessageQueue
6
11
  include Threadable
7
12
 
8
13
  # Initialize an event queue
9
14
  #
10
15
  # @example
11
- # EventQueue.new
16
+ # MessageQueue.new
12
17
  #
13
18
  # @api public
14
19
  def initialize
15
20
  @queue = Queue.new
16
21
  @dead = false
17
22
  @listeners = []
23
+ @thread = nil
24
+ end
25
+
26
+ # Start a new thread with a queue of callback events to run
27
+ #
28
+ # @api private
29
+ def start
30
+ return if running?
18
31
 
19
32
  @thread = Thread.new do
33
+ Thread.current.abort_on_exception = true
20
34
  process_events
21
35
  end
22
36
  end
23
37
 
38
+ def running?
39
+ !@thread.nil? && alive?
40
+ end
41
+
24
42
  # Retrieve the next event
25
43
  #
26
44
  # @return [AsyncCall]
@@ -41,7 +59,13 @@ module FiniteMachine
41
59
  #
42
60
  # @api public
43
61
  def <<(event)
44
- sync_exclusive { @queue << event }
62
+ sync_exclusive do
63
+ if @dead
64
+ discard_message(event)
65
+ else
66
+ @queue << event
67
+ end
68
+ end
45
69
  self
46
70
  end
47
71
 
@@ -89,6 +113,7 @@ module FiniteMachine
89
113
  #
90
114
  # @api public
91
115
  def join(timeout = nil)
116
+ return unless @thread
92
117
  timeout.nil? ? @thread.join : @thread.join(timeout)
93
118
  end
94
119
 
@@ -110,7 +135,7 @@ module FiniteMachine
110
135
  @dead = true
111
136
  end
112
137
  while !queue.empty?
113
- Logger.debug "Discarded message: #{queue.pop}"
138
+ discard_message(queue.pop)
114
139
  end
115
140
  true
116
141
  end
@@ -127,6 +152,10 @@ module FiniteMachine
127
152
  sync_shared { @queue.size }
128
153
  end
129
154
 
155
+ def inspect
156
+ "#<#{self.class}:#{object_id.to_s(16)} @size=#{size}, @dead=#{@dead}>"
157
+ end
158
+
130
159
  private
131
160
 
132
161
  # Notify consumers about process event
@@ -154,5 +183,9 @@ module FiniteMachine
154
183
  rescue Exception => ex
155
184
  Logger.error "Error while running event: #{Logger.format_error(ex)}"
156
185
  end
186
+
187
+ def discard_message(message)
188
+ Logger.debug "Discarded message: #{message}" if $DEBUG
189
+ end
157
190
  end # EventQueue
158
191
  end # FiniteMachine
@@ -16,11 +16,17 @@ module FiniteMachine
16
16
 
17
17
  # Initialize an Observer
18
18
  #
19
+ # @param [StateMachine] machine
20
+ # reference to the current machine
21
+ #
19
22
  # @api public
20
23
  def initialize(machine)
21
- @machine = machine
24
+ @machine = machine
25
+ @hooks = FiniteMachine::Hooks.new
26
+ @callback_queue = MessageQueue.new
27
+
22
28
  @machine.subscribe(self)
23
- @hooks = FiniteMachine::Hooks.new
29
+ ObjectSpace.define_finalizer(self, self.class.cleanup(@callback_queue))
24
30
  end
25
31
 
26
32
  # Evaluate in current context
@@ -130,24 +136,6 @@ module FiniteMachine
130
136
 
131
137
  private
132
138
 
133
- # Defer callback execution
134
- #
135
- # @api private
136
- def defer(callable, trans_event, *data)
137
- async_call = AsyncCall.new(machine, callable, trans_event, *data)
138
- machine.event_queue << async_call
139
- end
140
-
141
- # Create callable instance
142
- #
143
- # @api private
144
- def create_callable(hook)
145
- callback = proc do |trans_event, *data|
146
- machine.instance_exec(trans_event, *data, &hook)
147
- end
148
- Callable.new(callback)
149
- end
150
-
151
139
  # Handle callback and decide if run synchronously or asynchronously
152
140
  #
153
141
  # @param [Proc] :hook
@@ -177,6 +165,25 @@ module FiniteMachine
177
165
  end
178
166
  end
179
167
 
168
+ # Defer callback execution
169
+ #
170
+ # @api private
171
+ def defer(callable, trans_event, *data)
172
+ async_call = AsyncCall.new(machine, callable, trans_event, *data)
173
+ @callback_queue.start unless @callback_queue.running?
174
+ @callback_queue << async_call
175
+ end
176
+
177
+ # Create callable instance
178
+ #
179
+ # @api private
180
+ def create_callable(hook)
181
+ callback = proc do |trans_event, *data|
182
+ machine.instance_exec(trans_event, *data, &hook)
183
+ end
184
+ Callable.new(callback)
185
+ end
186
+
180
187
  # Callback names including all states and events
181
188
  #
182
189
  # @return [Array[Symbol]]
@@ -218,5 +225,17 @@ module FiniteMachine
218
225
  *_, callback_name = *method_name.to_s.match(/^(\w*?on_\w+?)_(\w+)$/)
219
226
  callback_name && callback_names.include?(:"#{callback_name}")
220
227
  end
228
+
229
+ # Clean up callback queue
230
+ #
231
+ # @api private
232
+ def self.cleanup(queue)
233
+ proc do
234
+ begin
235
+ queue && queue.shutdown
236
+ rescue MessageQueueDeadError
237
+ end
238
+ end
239
+ end
221
240
  end # Observer
222
241
  end # FiniteMachine
@@ -57,13 +57,6 @@ module FiniteMachine
57
57
  # @api private
58
58
  attr_threadsafe :subscribers
59
59
 
60
- # The queue for asynchronoous events
61
- #
62
- # @return [EventQueue]
63
- #
64
- # @api private
65
- attr_threadsafe :event_queue
66
-
67
60
  # Allow or not logging of transitions
68
61
  attr_threadsafe :log_transitions
69
62
 
@@ -72,13 +65,14 @@ module FiniteMachine
72
65
 
73
66
  def_delegator :events_dsl, :event
74
67
 
68
+ def_delegator :@async_proxy, :event_queue
69
+
75
70
  # Initialize state machine
76
71
  #
77
72
  # @api private
78
73
  def initialize(*args, &block)
79
74
  attributes = args.last.is_a?(Hash) ? args.pop : {}
80
75
 
81
- @event_queue = EventQueue.new
82
76
  @initial_state = DEFAULT_STATE
83
77
  @async_proxy = AsyncProxy.new(self)
84
78
  @subscribers = Subscribers.new
@@ -120,7 +114,7 @@ module FiniteMachine
120
114
  # @api public
121
115
  def async(method_name = nil, *args, &block)
122
116
  if method_name
123
- @async_proxy.method_missing method_name, *args, &block
117
+ @async_proxy.method_missing(method_name, *args, &block)
124
118
  else
125
119
  @async_proxy
126
120
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module FiniteMachine
4
- VERSION = "0.11.2"
4
+ VERSION = "0.11.3"
5
5
  end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe FiniteMachine do
4
+ include RSpec::Benchmark::Matchers
5
+
6
+ class Measurement
7
+ attr_reader :steps, :loops
8
+
9
+ def initialize
10
+ @steps = 0
11
+ @loops = 0
12
+ end
13
+
14
+ def inc_step
15
+ @steps += 1
16
+ end
17
+
18
+ def inc_loop
19
+ @loops += 1
20
+ end
21
+ end
22
+
23
+ it "correctly loops through events" do
24
+ measurement = Measurement.new
25
+
26
+ fsm = FiniteMachine.define do
27
+ initial :green
28
+
29
+ target(measurement)
30
+
31
+ events {
32
+ event :next, :green => :yellow,
33
+ :yellow => :red,
34
+ :red => :green
35
+ }
36
+
37
+ callbacks {
38
+ on_enter do |event| target.inc_step; true end
39
+ on_enter :red do |event| target.inc_loop; true end
40
+ }
41
+ end
42
+
43
+ 100.times { fsm.next }
44
+
45
+ expect(measurement.steps).to eq(100)
46
+ expect(measurement.loops).to eq(100 / 3)
47
+ end
48
+
49
+ it "performs at least 300 ips" do
50
+ fsm = FiniteMachine.define do
51
+ initial :green
52
+
53
+ events {
54
+ event :next, :green => :yellow,
55
+ :yellow => :red,
56
+ :red => :green
57
+ }
58
+ end
59
+
60
+ expect { fsm.next }.to perform_at_least(400).ips
61
+ end
62
+ end
data/spec/spec_helper.rb CHANGED
@@ -17,6 +17,7 @@ end
17
17
 
18
18
  require 'finite_machine'
19
19
  require 'thwait'
20
+ require 'rspec-benchmark'
20
21
 
21
22
  RSpec.configure do |config|
22
23
  config.run_all_when_everything_filtered = true
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ RSpec.describe FiniteMachine, 'async callbacks' do
4
+
5
+ it "permits async callback" do
6
+ called = []
7
+ fsm = FiniteMachine.define do
8
+ initial :green, silent: false
9
+
10
+ events {
11
+ event :slow, :green => :yellow
12
+ event :go, :yellow => :green
13
+ }
14
+
15
+ callbacks {
16
+ on_enter :green, :async do |event| called << 'on_enter_green' end
17
+ on_before :slow, :async do |event| called << 'on_before_slow' end
18
+ on_exit :yellow, :async do |event| called << 'on_exit_yellow' end
19
+ on_after :go, :async do |event| called << 'on_after_go' end
20
+ }
21
+ end
22
+ fsm.slow
23
+ fsm.go
24
+ sleep 0.1
25
+ expect(called).to match_array([
26
+ 'on_enter_green',
27
+ 'on_before_slow',
28
+ 'on_exit_yellow',
29
+ 'on_enter_green',
30
+ 'on_after_go'
31
+ ])
32
+ end
33
+ end
@@ -1,8 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
- RSpec.describe FiniteMachine, 'async_events' do
3
+ RSpec.describe FiniteMachine, 'async events' do
6
4
 
7
5
  it 'runs events asynchronously' do
8
6
  called = []
@@ -106,33 +104,4 @@ RSpec.describe FiniteMachine, 'async_events' do
106
104
  expect(fsmFoo.current).to eql(:yellow)
107
105
  expect(fsmBar.current).to eql(:yellow)
108
106
  end
109
-
110
- it "permits async callback" do
111
- called = []
112
- fsm = FiniteMachine.define do
113
- initial :green, silent: false
114
-
115
- events {
116
- event :slow, :green => :yellow
117
- event :go, :yellow => :green
118
- }
119
-
120
- callbacks {
121
- on_enter :green, :async do |event| called << 'on_enter_green' end
122
- on_before :slow, :async do |event| called << 'on_before_slow' end
123
- on_exit :yellow, :async do |event| called << 'on_exit_yellow' end
124
- on_after :go, :async do |event| called << 'on_after_go' end
125
- }
126
- end
127
- fsm.slow
128
- fsm.go
129
- sleep 0.1
130
- expect(called).to match_array([
131
- 'on_enter_green',
132
- 'on_before_slow',
133
- 'on_exit_yellow',
134
- 'on_enter_green',
135
- 'on_after_go'
136
- ])
137
- end
138
107
  end
@@ -1,12 +1,11 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
4
-
5
- RSpec.describe FiniteMachine::EventQueue do
3
+ RSpec.describe FiniteMachine::MessageQueue do
6
4
 
7
5
  subject(:event_queue) { described_class.new }
8
6
 
9
7
  it "dispatches all events" do
8
+ event_queue.start
10
9
  called = []
11
10
  event1 = double(:event1, dispatch: called << 'event1_dispatched')
12
11
  event2 = double(:event2, dispatch: called << 'event2_dispatched')
@@ -18,7 +17,9 @@ RSpec.describe FiniteMachine::EventQueue do
18
17
  end
19
18
 
20
19
  it "logs error" do
21
- event = double(:event)
20
+ event_queue.start
21
+ event = spy(:event)
22
+ allow(event).to receive(:dispatch) { raise }
22
23
  expect(FiniteMachine::Logger).to receive(:error)
23
24
  event_queue << event
24
25
  event_queue.join(0.01)
@@ -26,6 +27,7 @@ RSpec.describe FiniteMachine::EventQueue do
26
27
  end
27
28
 
28
29
  it "notifies listeners" do
30
+ event_queue.start
29
31
  called = []
30
32
  event1 = double(:event1, dispatch: true)
31
33
  event2 = double(:event2, dispatch: true)
@@ -38,6 +40,7 @@ RSpec.describe FiniteMachine::EventQueue do
38
40
  end
39
41
 
40
42
  it "allows to shutdown event queue" do
43
+ event_queue.start
41
44
  event1 = double(:event1, dispatch: true)
42
45
  event2 = double(:event2, dispatch: true)
43
46
  event3 = double(:event3, dispatch: true)
data/tasks/spec.rake CHANGED
@@ -18,6 +18,11 @@ begin
18
18
  RSpec::Core::RakeTask.new(:integration) do |task|
19
19
  task.pattern = 'spec/integration{,/*/**}/*_spec.rb'
20
20
  end
21
+
22
+ desc 'Run performance specs'
23
+ RSpec::Core::RakeTask.new(:perf) do |task|
24
+ task.pattern = 'spec/performance{,/*/**}/*_spec.rb'
25
+ end
21
26
  end
22
27
 
23
28
  rescue LoadError
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: finite_machine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.2
4
+ version: 0.11.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-30 00:00:00.000000000 Z
11
+ date: 2016-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 1.5.0
20
+ - - <
21
+ - !ruby/object:Gem::Version
22
+ version: '2.0'
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - '>='
25
28
  - !ruby/object:Gem::Version
26
- version: '0'
29
+ version: 1.5.0
30
+ - - <
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -49,8 +55,6 @@ extra_rdoc_files: []
49
55
  files:
50
56
  - .gitignore
51
57
  - .rspec
52
- - .ruby-gemset
53
- - .ruby-version
54
58
  - .travis.yml
55
59
  - CHANGELOG.md
56
60
  - Gemfile
@@ -58,6 +62,7 @@ files:
58
62
  - README.md
59
63
  - Rakefile
60
64
  - assets/finite_machine_logo.png
65
+ - benchmarks/memory_usage.rb
61
66
  - examples/atm.rb
62
67
  - examples/bug_system.rb
63
68
  - finite_machine.gemspec
@@ -71,12 +76,12 @@ files:
71
76
  - lib/finite_machine/dsl.rb
72
77
  - lib/finite_machine/env.rb
73
78
  - lib/finite_machine/event_definition.rb
74
- - lib/finite_machine/event_queue.rb
75
79
  - lib/finite_machine/events_chain.rb
76
80
  - lib/finite_machine/hook_event.rb
77
81
  - lib/finite_machine/hooks.rb
78
82
  - lib/finite_machine/listener.rb
79
83
  - lib/finite_machine/logger.rb
84
+ - lib/finite_machine/message_queue.rb
80
85
  - lib/finite_machine/observer.rb
81
86
  - lib/finite_machine/safety.rb
82
87
  - lib/finite_machine/state_definition.rb
@@ -91,8 +96,10 @@ files:
91
96
  - lib/finite_machine/undefined_transition.rb
92
97
  - lib/finite_machine/version.rb
93
98
  - spec/integration/system_spec.rb
99
+ - spec/performance/benchmark_spec.rb
94
100
  - spec/spec_helper.rb
95
101
  - spec/unit/alias_target_spec.rb
102
+ - spec/unit/async_callbacks_spec.rb
96
103
  - spec/unit/async_events_spec.rb
97
104
  - spec/unit/callable/call_spec.rb
98
105
  - spec/unit/callbacks_spec.rb
@@ -171,8 +178,10 @@ specification_version: 4
171
178
  summary: A minimal finite state machine with a straightforward syntax.
172
179
  test_files:
173
180
  - spec/integration/system_spec.rb
181
+ - spec/performance/benchmark_spec.rb
174
182
  - spec/spec_helper.rb
175
183
  - spec/unit/alias_target_spec.rb
184
+ - spec/unit/async_callbacks_spec.rb
176
185
  - spec/unit/async_events_spec.rb
177
186
  - spec/unit/callable/call_spec.rb
178
187
  - spec/unit/callbacks_spec.rb
data/.ruby-gemset DELETED
@@ -1 +0,0 @@
1
- finite_machine
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.0.0