finite_machine 0.14.0 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []