finite_machine 0.14.0 → 0.14.1

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
  SHA256:
3
- metadata.gz: 2d4822c18a4beea1845f39a33e910051412c7fea3479783b361897ecbc60b006
4
- data.tar.gz: ec4f8663f7ede7eb0357b9404b814ca670a523923f6c0b4435c2f09acd6c2e32
3
+ metadata.gz: d237cab6b48c16f3dbf2832706984e2b511f412085a11968504e23d154448e21
4
+ data.tar.gz: 48c5b0536832254ea609fd0047cb30efbd129b68b091ab462abb170a435b4fd8
5
5
  SHA512:
6
- metadata.gz: 57bdadc9ea5349045fe6711983dae949e8a8e78d569dbe7e91ac410b7afec7f1a2cfbb95f6b400b068ffcb1a7c4f783e84575f0680c2956ec5dc8473d91ee312
7
- data.tar.gz: b71c1fe3d0f8701fff5060b8dd6882fa9682e2a79dddbfda865d6d553c9130b896690ad16b4607a567e4d03f95a5dd0b4d33517cf008883e7dd1eab1851e411e
6
+ metadata.gz: f27fb87731702dc2df9b24d7a4da1525ec7bce7b432a49b278947010d4ff132bdd5d4c41002aebe39cbb354e03beda1c35cfabd4a2cc7f56872521688dfd3dd8
7
+ data.tar.gz: e7f3348c118d77359639ad5909048404bcdb7abbc14e775288cb07f8f7681141cb5a6252a4f0c377a7f9e32dc5d5f447a40c1e734f58397ef713809936e1207c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Change Log
2
2
 
3
+ ## [v0.14.1] - 2023-10-08
4
+
5
+ ### Fixed
6
+ * Fix defining object finalizer in Ruby 3.1 to reference a UUID string
7
+ by Vadim Kononov(@vkononov)
8
+ * Fix message queue shutdown to raise valid error
9
+ * Fix any_event and any_state methods in the define method and definition class
10
+ * Fix hooks_map initialization to be fully thread-safe
11
+ by Maciej Mensfeld(@mensfeld)
12
+
3
13
  ## [v0.14.0] - 2020-09-12
4
14
 
5
15
  ### Added
@@ -312,27 +322,28 @@
312
322
 
313
323
  * Initial release
314
324
 
315
- [v0.14.0]: https://github.com/peter-murach/finite_machine/compare/v0.13.0...v0.14.0
316
- [v0.13.0]: https://github.com/peter-murach/finite_machine/compare/v0.12.1...v0.13.0
317
- [v0.12.1]: https://github.com/peter-murach/finite_machine/compare/v0.12.0...v0.12.1
318
- [v0.12.0]: https://github.com/peter-murach/finite_machine/compare/v0.11.3...v0.12.0
319
- [v0.11.3]: https://github.com/peter-murach/finite_machine/compare/v0.11.2...v0.11.3
320
- [v0.11.2]: https://github.com/peter-murach/finite_machine/compare/v0.11.1...v0.11.2
321
- [v0.11.1]: https://github.com/peter-murach/finite_machine/compare/v0.11.0...v0.11.1
322
- [v0.11.0]: https://github.com/peter-murach/finite_machine/compare/v0.10.2...v0.11.0
323
- [v0.10.2]: https://github.com/peter-murach/finite_machine/compare/v0.10.1...v0.10.2
324
- [v0.10.1]: https://github.com/peter-murach/finite_machine/compare/v0.10.0...v0.10.1
325
- [v0.10.0]: https://github.com/peter-murach/finite_machine/compare/v0.9.2...v0.10.0
326
- [v0.9.2]: https://github.com/peter-murach/finite_machine/compare/v0.9.1...v0.9.2
327
- [v0.9.1]: https://github.com/peter-murach/finite_machine/compare/v0.9.0...v0.9.1
328
- [v0.9.0]: https://github.com/peter-murach/finite_machine/compare/v0.8.1...v0.9.0
329
- [v0.8.1]: https://github.com/peter-murach/finite_machine/compare/v0.8.0...v0.8.1
330
- [v0.8.0]: https://github.com/peter-murach/finite_machine/compare/v0.7.1...v0.8.0
331
- [v0.7.1]: https://github.com/peter-murach/finite_machine/compare/v0.7.0...v0.7.1
332
- [v0.7.0]: https://github.com/peter-murach/finite_machine/compare/v0.6.1...v0.7.0
333
- [v0.6.1]: https://github.com/peter-murach/finite_machine/compare/v0.6.0...v0.6.1
334
- [v0.6.0]: https://github.com/peter-murach/finite_machine/compare/v0.5.0...v0.6.0
335
- [v0.5.0]: https://github.com/peter-murach/finite_machine/compare/v0.4.0...v0.5.0
336
- [v0.4.0]: https://github.com/peter-murach/finite_machine/compare/v0.3.0...v0.4.0
337
- [v0.3.0]: https://github.com/peter-murach/finite_machine/compare/v0.2.0...v0.3.0
338
- [v0.2.0]: https://github.com/peter-murach/finite_machine/compare/v0.1.0...v0.2.0
325
+ [v0.14.1]: https://github.com/piotrmurach/finite_machine/compare/v0.14.0...v0.14.1
326
+ [v0.14.0]: https://github.com/piotrmurach/finite_machine/compare/v0.13.0...v0.14.0
327
+ [v0.13.0]: https://github.com/piotrmurach/finite_machine/compare/v0.12.1...v0.13.0
328
+ [v0.12.1]: https://github.com/piotrmurach/finite_machine/compare/v0.12.0...v0.12.1
329
+ [v0.12.0]: https://github.com/piotrmurach/finite_machine/compare/v0.11.3...v0.12.0
330
+ [v0.11.3]: https://github.com/piotrmurach/finite_machine/compare/v0.11.2...v0.11.3
331
+ [v0.11.2]: https://github.com/piotrmurach/finite_machine/compare/v0.11.1...v0.11.2
332
+ [v0.11.1]: https://github.com/piotrmurach/finite_machine/compare/v0.11.0...v0.11.1
333
+ [v0.11.0]: https://github.com/piotrmurach/finite_machine/compare/v0.10.2...v0.11.0
334
+ [v0.10.2]: https://github.com/piotrmurach/finite_machine/compare/v0.10.1...v0.10.2
335
+ [v0.10.1]: https://github.com/piotrmurach/finite_machine/compare/v0.10.0...v0.10.1
336
+ [v0.10.0]: https://github.com/piotrmurach/finite_machine/compare/v0.9.2...v0.10.0
337
+ [v0.9.2]: https://github.com/piotrmurach/finite_machine/compare/v0.9.1...v0.9.2
338
+ [v0.9.1]: https://github.com/piotrmurach/finite_machine/compare/v0.9.0...v0.9.1
339
+ [v0.9.0]: https://github.com/piotrmurach/finite_machine/compare/v0.8.1...v0.9.0
340
+ [v0.8.1]: https://github.com/piotrmurach/finite_machine/compare/v0.8.0...v0.8.1
341
+ [v0.8.0]: https://github.com/piotrmurach/finite_machine/compare/v0.7.1...v0.8.0
342
+ [v0.7.1]: https://github.com/piotrmurach/finite_machine/compare/v0.7.0...v0.7.1
343
+ [v0.7.0]: https://github.com/piotrmurach/finite_machine/compare/v0.6.1...v0.7.0
344
+ [v0.6.1]: https://github.com/piotrmurach/finite_machine/compare/v0.6.0...v0.6.1
345
+ [v0.6.0]: https://github.com/piotrmurach/finite_machine/compare/v0.5.0...v0.6.0
346
+ [v0.5.0]: https://github.com/piotrmurach/finite_machine/compare/v0.4.0...v0.5.0
347
+ [v0.4.0]: https://github.com/piotrmurach/finite_machine/compare/v0.3.0...v0.4.0
348
+ [v0.3.0]: https://github.com/piotrmurach/finite_machine/compare/v0.2.0...v0.3.0
349
+ [v0.2.0]: https://github.com/piotrmurach/finite_machine/compare/v0.1.0...v0.2.0
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  # FiniteMachine
6
6
 
7
7
  [![Gem Version](https://badge.fury.io/rb/finite_machine.svg)][gem]
8
- [![Build Status](https://secure.travis-ci.org/piotrmurach/finite_machine.svg?branch=master)][travis]
8
+ [![Actions CI](https://github.com/piotrmurach/finite_machine/workflows/CI/badge.svg?branch=master)][gh_actions_ci]
9
9
  [![Build status](https://ci.appveyor.com/api/projects/status/8ho4ijacpr7b4f4t?svg=true)][appveyor]
10
10
  [![Code Climate](https://codeclimate.com/github/piotrmurach/finite_machine/badges/gpa.svg)][codeclimate]
11
11
  [![Coverage Status](https://coveralls.io/repos/github/piotrmurach/finite_machine/badge.svg?branch=master)][coverage]
@@ -13,7 +13,7 @@
13
13
  [![Gitter](https://badges.gitter.im/Join%20Chat.svg)][gitter]
14
14
 
15
15
  [gem]: http://badge.fury.io/rb/finite_machine
16
- [travis]: http://travis-ci.org/piotrmurach/finite_machine
16
+ [gh_actions_ci]: https://github.com/piotrmurach/finite_machine/actions?query=workflow%3ACI
17
17
  [appveyor]: https://ci.appveyor.com/project/piotrmurach/finite-machine
18
18
  [codeclimate]: https://codeclimate.com/github/piotrmurach/finite_machine
19
19
  [coverage]: https://coveralls.io/github/piotrmurach/finite_machine?branch=master
@@ -1494,6 +1494,10 @@ Creating a standalone **FiniteMachine** brings a number of benefits, one of them
1494
1494
  4. Push to the branch (`git push origin my-new-feature`)
1495
1495
  5. Create new Pull Request
1496
1496
 
1497
+ ## Code of Conduct
1498
+
1499
+ Everyone interacting in the FiniteMachine project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/piotrmurach/finite_machine/blob/master/CODE_OF_CONDUCT.md).
1500
+
1497
1501
  ## Copyright
1498
1502
 
1499
1503
  Copyright (c) 2014 Piotr Murach. See LICENSE for further details.
@@ -1,30 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FiniteMachine
4
- # A class responsible for defining standalone state machine
4
+ # Responsible for defining a standalone state machine
5
+ #
6
+ # @api public
5
7
  class Definition
6
- # The machine deferreds
8
+ # The any event constant
7
9
  #
8
- # @return [Array[Proc]]
10
+ # @example
11
+ # on_before(any_event) { ... }
9
12
  #
10
- # @api private
11
- def self.deferreds
12
- @deferreds ||= []
13
+ # @return [FiniteMachine::Const]
14
+ #
15
+ # @api public
16
+ def self.any_event
17
+ ANY_EVENT
13
18
  end
14
19
 
15
- # Add deferred
20
+ # The any state constant
16
21
  #
17
- # @param [Proc] deferred
18
- # the deferred execution
22
+ # @example
23
+ # event :go, any_state => :green
19
24
  #
20
- # @return [Array[Proc]]
25
+ # @example
26
+ # on_enter(any_state) { ... }
21
27
  #
22
- # @api private
23
- def self.add_deferred(deferred)
24
- deferreds << deferred
28
+ # @return [FiniteMachine::Const]
29
+ #
30
+ # @api public
31
+ def self.any_state
32
+ ANY_STATE
25
33
  end
26
34
 
27
- # Instantiate a new Definition
35
+ # Initialize a StateMachine
28
36
  #
29
37
  # @example
30
38
  # class Engine < FiniteMachine::Definition
@@ -43,7 +51,12 @@ module FiniteMachine
43
51
  end
44
52
  end
45
53
 
46
- # Set deferrerd methods on the subclass
54
+ # Add deferred methods to the subclass
55
+ #
56
+ # @param [Class] subclass
57
+ # the inheriting subclass
58
+ #
59
+ # @return [void]
47
60
  #
48
61
  # @api private
49
62
  def self.inherited(subclass)
@@ -52,11 +65,35 @@ module FiniteMachine
52
65
  deferreds.each { |d| subclass.add_deferred(d) }
53
66
  end
54
67
 
68
+ # The state machine deferreds
69
+ #
70
+ # @return [Array<Proc>]
71
+ #
72
+ # @api private
73
+ def self.deferreds
74
+ @deferreds ||= []
75
+ end
76
+
77
+ # Add deferred
78
+ #
79
+ # @param [Proc] deferred
80
+ # the deferred execution
81
+ #
82
+ # @return [Array<Proc>]
83
+ #
84
+ # @api private
85
+ def self.add_deferred(deferred)
86
+ deferreds << deferred
87
+ end
88
+
55
89
  # Delay lookup of DSL method
56
90
  #
57
91
  # @param [Symbol] method_name
92
+ # the method name
93
+ # @param [Array] arguments
94
+ # the method arguments
58
95
  #
59
- # @return [nil]
96
+ # @return [void]
60
97
  #
61
98
  # @api private
62
99
  def self.method_missing(method_name, *arguments, &block)
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "concurrent/array"
3
4
  require "concurrent/map"
4
5
 
5
6
  require_relative "hook_event"
@@ -12,13 +13,17 @@ module FiniteMachine
12
13
  # Initialize a hooks_map of hooks
13
14
  #
14
15
  # @example
15
- # Hoosk.new(machine)
16
+ # Hooks.new
16
17
  #
17
18
  # @api public
18
19
  def initialize
19
20
  @hooks_map = Concurrent::Map.new do |events_hash, hook_event|
20
- events_hash[hook_event] = Concurrent::Map.new do |state_hash, name|
21
- state_hash[name] = []
21
+ events_hash.compute_if_absent(hook_event) do
22
+ Concurrent::Map.new do |state_hash, name|
23
+ state_hash.compute_if_absent(name) do
24
+ Concurrent::Array.new
25
+ end
26
+ end
22
27
  end
23
28
  end
24
29
  end
@@ -4,17 +4,17 @@ require_relative "listener"
4
4
  require "thread"
5
5
 
6
6
  module FiniteMachine
7
- # Allows for storage of asynchronous messages such as events
7
+ # Responsible for storage of asynchronous messages such as events
8
8
  # and callbacks.
9
9
  #
10
- # Used internally by {Observer} and {StateMachine}
10
+ # Used internally by {Observer}
11
11
  #
12
12
  # @api private
13
13
  class MessageQueue
14
- # Initialize an event queue in separate thread
14
+ # Initialize a MessageQueue
15
15
  #
16
16
  # @example
17
- # MessageQueue.new
17
+ # message_queue = FiniteMachine::MessageQueue.new
18
18
  #
19
19
  # @api public
20
20
  def initialize
@@ -28,6 +28,11 @@ module FiniteMachine
28
28
 
29
29
  # Start a new thread with a queue of callback events to run
30
30
  #
31
+ # @example
32
+ # message_queue.start
33
+ #
34
+ # @return [Thread, nil]
35
+ #
31
36
  # @api private
32
37
  def start
33
38
  return if running?
@@ -35,7 +40,9 @@ module FiniteMachine
35
40
  @mutex.synchronize { spawn_thread }
36
41
  end
37
42
 
38
- # Spawn new background thread
43
+ # Spawn a new background thread
44
+ #
45
+ # @return [Thread]
39
46
  #
40
47
  # @api private
41
48
  def spawn_thread
@@ -45,18 +52,27 @@ module FiniteMachine
45
52
  end
46
53
  end
47
54
 
55
+ # Check whether or not the message queue is running
56
+ #
57
+ # @example
58
+ # message_queue.running?
59
+ #
60
+ # @return [Boolean]
61
+ #
62
+ # @api public
48
63
  def running?
49
64
  !@thread.nil? && alive?
50
65
  end
51
66
 
52
- # Add asynchronous event to the event queue to process
67
+ # Add an asynchronous event to the message queue to process
53
68
  #
54
69
  # @example
55
- # event_queue << AsyncCall.build(...)
70
+ # message_queue << AsyncCall.build(...)
56
71
  #
57
- # @param [AsyncCall] event
72
+ # @param [FiniteMachine::AsyncCall] event
73
+ # the event to add
58
74
  #
59
- # @return [nil]
75
+ # @return [void]
60
76
  #
61
77
  # @api public
62
78
  def <<(event)
@@ -70,7 +86,12 @@ module FiniteMachine
70
86
  end
71
87
  end
72
88
 
73
- # Add listener to the queue to receive messages
89
+ # Add a listener for the message queue to receive notifications
90
+ #
91
+ # @example
92
+ # message_queue.subscribe { |event| ... }
93
+ #
94
+ # @return [void]
74
95
  #
75
96
  # @api public
76
97
  def subscribe(*args, &block)
@@ -81,20 +102,20 @@ module FiniteMachine
81
102
  end
82
103
  end
83
104
 
84
- # Check if there are any events to handle
105
+ # Check whether or not there are any messages to handle
85
106
  #
86
107
  # @example
87
- # event_queue.empty?
108
+ # message_queue.empty?
88
109
  #
89
110
  # @api public
90
111
  def empty?
91
112
  @mutex.synchronize { @queue.empty? }
92
113
  end
93
114
 
94
- # Check if the event queue is alive
115
+ # Check whether or not the message queue is alive
95
116
  #
96
117
  # @example
97
- # event_queue.alive?
118
+ # message_queue.alive?
98
119
  #
99
120
  # @return [Boolean]
100
121
  #
@@ -103,14 +124,15 @@ module FiniteMachine
103
124
  @mutex.synchronize { !@dead }
104
125
  end
105
126
 
106
- # Join the event queue from current thread
127
+ # Join the message queue from the current thread
107
128
  #
108
129
  # @param [Fixnum] timeout
130
+ # the time limit
109
131
  #
110
132
  # @example
111
- # event_queue.join
133
+ # message_queue.join
112
134
  #
113
- # @return [nil, Thread]
135
+ # @return [Thread, nil]
114
136
  #
115
137
  # @api public
116
138
  def join(timeout = nil)
@@ -119,16 +141,18 @@ module FiniteMachine
119
141
  timeout.nil? ? @thread.join : @thread.join(timeout)
120
142
  end
121
143
 
122
- # Shut down this event queue and clean it up
144
+ # Shut down this message queue and clean it up
123
145
  #
124
146
  # @example
125
- # event_queue.shutdown
147
+ # message_queue.shutdown
148
+ #
149
+ # @raise [FiniteMachine::MessageQueueDeadError]
126
150
  #
127
151
  # @return [Boolean]
128
152
  #
129
153
  # @api public
130
154
  def shutdown
131
- raise EventQueueDeadError, "event queue already dead" if @dead
155
+ raise MessageQueueDeadError, "message queue already dead" if @dead
132
156
 
133
157
  queue = []
134
158
  @mutex.synchronize do
@@ -144,10 +168,10 @@ module FiniteMachine
144
168
  true
145
169
  end
146
170
 
147
- # Get number of events waiting for processing
171
+ # The number of messages waiting for processing
148
172
  #
149
173
  # @example
150
- # event_queue.size
174
+ # message_queue.size
151
175
  #
152
176
  # @return [Integer]
153
177
  #
@@ -156,6 +180,14 @@ module FiniteMachine
156
180
  @mutex.synchronize { @queue.size }
157
181
  end
158
182
 
183
+ # Inspect this message queue
184
+ #
185
+ # @example
186
+ # message_queue.inspect
187
+ #
188
+ # @return [String]
189
+ #
190
+ # @api public
159
191
  def inspect
160
192
  @mutex.synchronize do
161
193
  "#<#{self.class}:#{object_id.to_s(16)} @size=#{size}, @dead=#{@dead}>"
@@ -164,9 +196,12 @@ module FiniteMachine
164
196
 
165
197
  private
166
198
 
167
- # Notify consumers about process event
199
+ # Notify listeners about the event
200
+ #
201
+ # @param [FiniteMachine::AsyncCall] event
202
+ # the event to notify listeners about
168
203
  #
169
- # @param [AsyncCall] event
204
+ # @return [void]
170
205
  #
171
206
  # @api private
172
207
  def notify_listeners(event)
@@ -195,6 +230,14 @@ module FiniteMachine
195
230
  Logger.error "Error while running event: #{Logger.format_error(ex)}"
196
231
  end
197
232
 
233
+ # Log discarded message
234
+ #
235
+ # @param [FiniteMachine::AsyncCall] message
236
+ # the message to discard
237
+ #
238
+ # @return [void]
239
+ #
240
+ # @api private
198
241
  def discard_message(message)
199
242
  Logger.debug "Discarded message: #{message}" if $DEBUG
200
243
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "securerandom"
4
+
3
5
  require_relative "async_call"
4
6
  require_relative "callable"
5
7
  require_relative "hook_event"
@@ -13,20 +15,6 @@ module FiniteMachine
13
15
  class Observer < GenericDSL
14
16
  include Safety
15
17
 
16
- # Clean up callback queue
17
- #
18
- # @api private
19
- def self.cleanup_callback_queue
20
- proc do
21
- begin
22
- if callback_queue.alive?
23
- callback_queue.shutdown
24
- end
25
- rescue MessageQueueDeadError
26
- end
27
- end
28
- end
29
-
30
18
  # The current state machine
31
19
  attr_reader :machine
32
20
 
@@ -44,11 +32,6 @@ module FiniteMachine
44
32
  @hooks = Hooks.new
45
33
 
46
34
  @machine.subscribe(self)
47
- ObjectSpace.define_finalizer(self, self.class.cleanup_callback_queue)
48
- end
49
-
50
- def callback_queue
51
- @callback_queue ||= MessageQueue.new
52
35
  end
53
36
 
54
37
  # Evaluate in current context
@@ -204,6 +187,35 @@ module FiniteMachine
204
187
  callback_queue << async_call
205
188
  end
206
189
 
190
+ # Get an existing callback queue or create a new one
191
+ #
192
+ # @return [FiniteMachine::MessageQueue]
193
+ #
194
+ # @api private
195
+ def callback_queue
196
+ @callback_queue ||= MessageQueue.new.tap do
197
+ @queue_id = SecureRandom.uuid
198
+ ObjectSpace.define_finalizer(@queue_id, proc do
199
+ cleanup_callback_queue
200
+ end)
201
+ end
202
+ end
203
+
204
+ # Clean up the callback queue
205
+ #
206
+ # @return [Boolean, nil]
207
+ #
208
+ # @api private
209
+ def cleanup_callback_queue
210
+ ObjectSpace.undefine_finalizer(@queue_id) if @queue_id
211
+ return unless @callback_queue && callback_queue.alive?
212
+
213
+ begin
214
+ callback_queue.shutdown
215
+ rescue MessageQueueDeadError
216
+ end
217
+ end
218
+
207
219
  # Create callable instance
208
220
  #
209
221
  # @api private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FiniteMachine
4
- VERSION = "0.14.0"
4
+ VERSION = "0.14.1"
5
5
  end
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.14.0
4
+ version: 0.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-12 00:00:00.000000000 Z
11
+ date: 2023-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -115,11 +115,13 @@ licenses:
115
115
  - MIT
116
116
  metadata:
117
117
  allowed_push_host: https://rubygems.org
118
+ bug_tracker_uri: https://github.com/piotrmurach/finite_machine/issues
118
119
  changelog_uri: https://github.com/piotrmurach/finite_machine/blob/master/CHANGELOG.md
119
120
  documentation_uri: https://www.rubydoc.info/gems/finite_machine
120
121
  homepage_uri: https://piotrmurach.github.io/finite_machine/
122
+ rubygems_mfa_required: 'true'
121
123
  source_code_uri: https://github.com/piotrmurach/finite_machine
122
- post_install_message:
124
+ post_install_message:
123
125
  rdoc_options: []
124
126
  require_paths:
125
127
  - lib
@@ -134,8 +136,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
136
  - !ruby/object:Gem::Version
135
137
  version: '0'
136
138
  requirements: []
137
- rubygems_version: 3.1.2
138
- signing_key:
139
+ rubygems_version: 3.3.26
140
+ signing_key:
139
141
  specification_version: 4
140
142
  summary: A minimal finite state machine with a straightforward syntax.
141
143
  test_files: []