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 +4 -4
- data/CHANGELOG.md +35 -24
- data/README.md +6 -2
- data/lib/finite_machine/definition.rb +53 -16
- data/lib/finite_machine/hooks.rb +8 -3
- data/lib/finite_machine/message_queue.rb +67 -24
- data/lib/finite_machine/observer.rb +31 -19
- data/lib/finite_machine/version.rb +1 -1
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d237cab6b48c16f3dbf2832706984e2b511f412085a11968504e23d154448e21
|
4
|
+
data.tar.gz: 48c5b0536832254ea609fd0047cb30efbd129b68b091ab462abb170a435b4fd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
316
|
-
[v0.
|
317
|
-
[v0.
|
318
|
-
[v0.12.
|
319
|
-
[v0.
|
320
|
-
[v0.11.
|
321
|
-
[v0.11.
|
322
|
-
[v0.11.
|
323
|
-
[v0.
|
324
|
-
[v0.10.
|
325
|
-
[v0.10.
|
326
|
-
[v0.
|
327
|
-
[v0.9.
|
328
|
-
[v0.9.
|
329
|
-
[v0.
|
330
|
-
[v0.8.
|
331
|
-
[v0.
|
332
|
-
[v0.7.
|
333
|
-
[v0.
|
334
|
-
[v0.6.
|
335
|
-
[v0.
|
336
|
-
[v0.
|
337
|
-
[v0.
|
338
|
-
[v0.
|
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]
|
8
|
-
[][gh_actions_ci]
|
9
9
|
[][appveyor]
|
10
10
|
[][codeclimate]
|
11
11
|
[][coverage]
|
@@ -13,7 +13,7 @@
|
|
13
13
|
[][gitter]
|
14
14
|
|
15
15
|
[gem]: http://badge.fury.io/rb/finite_machine
|
16
|
-
[
|
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
|
-
#
|
4
|
+
# Responsible for defining a standalone state machine
|
5
|
+
#
|
6
|
+
# @api public
|
5
7
|
class Definition
|
6
|
-
# The
|
8
|
+
# The any event constant
|
7
9
|
#
|
8
|
-
# @
|
10
|
+
# @example
|
11
|
+
# on_before(any_event) { ... }
|
9
12
|
#
|
10
|
-
# @
|
11
|
-
|
12
|
-
|
13
|
+
# @return [FiniteMachine::Const]
|
14
|
+
#
|
15
|
+
# @api public
|
16
|
+
def self.any_event
|
17
|
+
ANY_EVENT
|
13
18
|
end
|
14
19
|
|
15
|
-
#
|
20
|
+
# The any state constant
|
16
21
|
#
|
17
|
-
# @
|
18
|
-
#
|
22
|
+
# @example
|
23
|
+
# event :go, any_state => :green
|
19
24
|
#
|
20
|
-
# @
|
25
|
+
# @example
|
26
|
+
# on_enter(any_state) { ... }
|
21
27
|
#
|
22
|
-
# @
|
23
|
-
|
24
|
-
|
28
|
+
# @return [FiniteMachine::Const]
|
29
|
+
#
|
30
|
+
# @api public
|
31
|
+
def self.any_state
|
32
|
+
ANY_STATE
|
25
33
|
end
|
26
34
|
|
27
|
-
#
|
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
|
-
#
|
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 [
|
96
|
+
# @return [void]
|
60
97
|
#
|
61
98
|
# @api private
|
62
99
|
def self.method_missing(method_name, *arguments, &block)
|
data/lib/finite_machine/hooks.rb
CHANGED
@@ -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
|
-
#
|
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
|
21
|
-
state_hash
|
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
|
-
#
|
7
|
+
# Responsible for storage of asynchronous messages such as events
|
8
8
|
# and callbacks.
|
9
9
|
#
|
10
|
-
# Used internally by {Observer}
|
10
|
+
# Used internally by {Observer}
|
11
11
|
#
|
12
12
|
# @api private
|
13
13
|
class MessageQueue
|
14
|
-
# Initialize
|
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
|
67
|
+
# Add an asynchronous event to the message queue to process
|
53
68
|
#
|
54
69
|
# @example
|
55
|
-
#
|
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 [
|
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
|
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
|
105
|
+
# Check whether or not there are any messages to handle
|
85
106
|
#
|
86
107
|
# @example
|
87
|
-
#
|
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
|
115
|
+
# Check whether or not the message queue is alive
|
95
116
|
#
|
96
117
|
# @example
|
97
|
-
#
|
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
|
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
|
-
#
|
133
|
+
# message_queue.join
|
112
134
|
#
|
113
|
-
# @return [
|
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
|
144
|
+
# Shut down this message queue and clean it up
|
123
145
|
#
|
124
146
|
# @example
|
125
|
-
#
|
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
|
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
|
-
#
|
171
|
+
# The number of messages waiting for processing
|
148
172
|
#
|
149
173
|
# @example
|
150
|
-
#
|
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
|
199
|
+
# Notify listeners about the event
|
200
|
+
#
|
201
|
+
# @param [FiniteMachine::AsyncCall] event
|
202
|
+
# the event to notify listeners about
|
168
203
|
#
|
169
|
-
# @
|
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
|
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.
|
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:
|
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.
|
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: []
|