goru 0.3.0 → 0.4.0
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 +10 -0
- data/lib/goru/bridge.rb +14 -2
- data/lib/goru/bridges/readable.rb +5 -5
- data/lib/goru/bridges/writable.rb +5 -5
- data/lib/goru/channel.rb +0 -4
- data/lib/goru/reactor.rb +21 -5
- data/lib/goru/routine.rb +62 -9
- data/lib/goru/routines/channel.rb +2 -2
- data/lib/goru/routines/channels/readable.rb +3 -3
- data/lib/goru/routines/channels/writable.rb +3 -3
- data/lib/goru/routines/io.rb +9 -5
- data/lib/goru/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a1bad5e42a7c84e99e1e75651c62f0c2459497aacafea49319279d8de5251c9c
|
|
4
|
+
data.tar.gz: 4c6a172e82892ce4301482d42fe03c59b299e6409efbc1bd620aacaf2bc24301
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9dbcc82cce20117208062ac716097982b96ad59bec1fa6a3326f5703ea47529c7afb2ddf9531d81b0b237d77a13aab253494c74da5c8312eb166bde150525707
|
|
7
|
+
data.tar.gz: a6259dac811fabfd7791319d09e3ddf228b8b8a7f3f73e829fcd1b29630eae52e2c503a5682c7b3ac269068464947da2254343e0f0743ee0111284f87d9a284c
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
## [v0.4.0](https://github.com/bryanp/goru/releases/tag/v0.4.0)
|
|
2
|
+
|
|
3
|
+
*released on 2023-07-16*
|
|
4
|
+
|
|
5
|
+
* `add` [#22](https://github.com/bryanp/goru/pull/22) Add reactor as a reader to `Goru::Routine` ([bryanp](https://github.com/bryanp))
|
|
6
|
+
* `add` [#21](https://github.com/bryanp/goru/pull/21) Improve statuses ([bryanp](https://github.com/bryanp))
|
|
7
|
+
* `add` [#20](https://github.com/bryanp/goru/pull/20) Add observer pattern to routines ([bryanp](https://github.com/bryanp))
|
|
8
|
+
* `add` [#19](https://github.com/bryanp/goru/pull/19) Add ability to pause and resume a routine ([bryanp](https://github.com/bryanp))
|
|
9
|
+
* `chg` [#18](https://github.com/bryanp/goru/pull/18) Remove the unused `observer` writer from `Goru::Channel` ([bryanp](https://github.com/bryanp))
|
|
10
|
+
|
|
1
11
|
## [v0.3.0](https://github.com/bryanp/goru/releases/tag/v0.3.0)
|
|
2
12
|
|
|
3
13
|
*released on 2023-07-10*
|
data/lib/goru/bridge.rb
CHANGED
|
@@ -11,6 +11,18 @@ module Goru
|
|
|
11
11
|
update_status
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
+
# [public]
|
|
15
|
+
#
|
|
16
|
+
STATUS_READY = :ready
|
|
17
|
+
|
|
18
|
+
# [public]
|
|
19
|
+
#
|
|
20
|
+
STATUS_FINISHED = :finished
|
|
21
|
+
|
|
22
|
+
# [public]
|
|
23
|
+
#
|
|
24
|
+
STATUS_IDLE = :idle
|
|
25
|
+
|
|
14
26
|
# [public]
|
|
15
27
|
#
|
|
16
28
|
attr_reader :status
|
|
@@ -30,9 +42,9 @@ module Goru
|
|
|
30
42
|
|
|
31
43
|
private def status_changed
|
|
32
44
|
case @status
|
|
33
|
-
when :
|
|
45
|
+
when :STATUS_READY
|
|
34
46
|
@routine.bridged
|
|
35
|
-
when :
|
|
47
|
+
when :STATUS_FINISHED
|
|
36
48
|
@channel.remove_observer(self)
|
|
37
49
|
@routine.unbridge
|
|
38
50
|
end
|
|
@@ -6,14 +6,14 @@ module Goru
|
|
|
6
6
|
module Bridges
|
|
7
7
|
class Readable < Bridge
|
|
8
8
|
private def update_status
|
|
9
|
-
status = if @routine.status ==
|
|
10
|
-
|
|
9
|
+
status = if @routine.status == Routine::STATUS_FINISHED
|
|
10
|
+
Bridge::STATUS_FINISHED
|
|
11
11
|
elsif @channel.full?
|
|
12
|
-
|
|
12
|
+
Bridge::STATUS_IDLE
|
|
13
13
|
elsif @channel.closed?
|
|
14
|
-
|
|
14
|
+
Bridge::STATUS_FINISHED
|
|
15
15
|
else
|
|
16
|
-
|
|
16
|
+
Bridge::STATUS_READY
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
set_status(status)
|
|
@@ -6,14 +6,14 @@ module Goru
|
|
|
6
6
|
module Bridges
|
|
7
7
|
class Writable < Bridge
|
|
8
8
|
private def update_status
|
|
9
|
-
status = if @routine.status ==
|
|
10
|
-
|
|
9
|
+
status = if @routine.status == Routine::STATUS_FINISHED
|
|
10
|
+
Bridge::STATUS_FINISHED
|
|
11
11
|
elsif @channel.any?
|
|
12
|
-
|
|
12
|
+
Bridge::STATUS_READY
|
|
13
13
|
elsif @channel.closed?
|
|
14
|
-
|
|
14
|
+
Bridge::STATUS_FINISHED
|
|
15
15
|
else
|
|
16
|
-
|
|
16
|
+
Bridge::STATUS_IDLE
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
set_status(status)
|
data/lib/goru/channel.rb
CHANGED
data/lib/goru/reactor.rb
CHANGED
|
@@ -21,6 +21,22 @@ module Goru
|
|
|
21
21
|
@commands = []
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
+
# [public]
|
|
25
|
+
#
|
|
26
|
+
STATUS_RUNNING = :running
|
|
27
|
+
|
|
28
|
+
# [public]
|
|
29
|
+
#
|
|
30
|
+
STATUS_FINISHED = :finished
|
|
31
|
+
|
|
32
|
+
# [public]
|
|
33
|
+
#
|
|
34
|
+
STATUS_IDLE = :idle
|
|
35
|
+
|
|
36
|
+
# [public]
|
|
37
|
+
#
|
|
38
|
+
STATUS_STOPPED = :stopped
|
|
39
|
+
|
|
24
40
|
# [public]
|
|
25
41
|
#
|
|
26
42
|
attr_reader :status
|
|
@@ -28,7 +44,7 @@ module Goru
|
|
|
28
44
|
# [public]
|
|
29
45
|
#
|
|
30
46
|
def run
|
|
31
|
-
set_status(
|
|
47
|
+
set_status(STATUS_RUNNING)
|
|
32
48
|
|
|
33
49
|
until @stopped
|
|
34
50
|
tick
|
|
@@ -36,7 +52,7 @@ module Goru
|
|
|
36
52
|
ensure
|
|
37
53
|
@timers.cancel
|
|
38
54
|
@selector.close
|
|
39
|
-
set_status(
|
|
55
|
+
set_status(STATUS_FINISHED)
|
|
40
56
|
end
|
|
41
57
|
|
|
42
58
|
private def tick
|
|
@@ -81,10 +97,10 @@ module Goru
|
|
|
81
97
|
interval = @timers.wait_interval
|
|
82
98
|
|
|
83
99
|
if interval.nil? && @routines.empty?
|
|
84
|
-
set_status(
|
|
100
|
+
set_status(STATUS_IDLE)
|
|
85
101
|
@scheduler.signal
|
|
86
102
|
wait
|
|
87
|
-
set_status(
|
|
103
|
+
set_status(STATUS_RUNNING)
|
|
88
104
|
elsif interval.nil?
|
|
89
105
|
wait unless @routines.any?(&:ready?)
|
|
90
106
|
elsif interval > 0
|
|
@@ -103,7 +119,7 @@ module Goru
|
|
|
103
119
|
# [public]
|
|
104
120
|
#
|
|
105
121
|
def finished?
|
|
106
|
-
@status ==
|
|
122
|
+
@status == STATUS_IDLE || @status == STATUS_STOPPED
|
|
107
123
|
end
|
|
108
124
|
|
|
109
125
|
# [public]
|
data/lib/goru/routine.rb
CHANGED
|
@@ -20,14 +20,35 @@ module Goru
|
|
|
20
20
|
def initialize(state = nil, &block)
|
|
21
21
|
@state = state
|
|
22
22
|
@block = block
|
|
23
|
-
|
|
23
|
+
@observers = Set.new
|
|
24
|
+
set_status(STATUS_READY)
|
|
24
25
|
@result, @error, @reactor = nil
|
|
25
26
|
@debug = true
|
|
26
27
|
end
|
|
27
28
|
|
|
28
29
|
# [public]
|
|
29
30
|
#
|
|
30
|
-
|
|
31
|
+
STATUS_READY = :ready
|
|
32
|
+
|
|
33
|
+
# [public]
|
|
34
|
+
#
|
|
35
|
+
STATUS_FINISHED = :finished
|
|
36
|
+
|
|
37
|
+
# [public]
|
|
38
|
+
#
|
|
39
|
+
STATUS_ERRORED = :errored
|
|
40
|
+
|
|
41
|
+
# [public]
|
|
42
|
+
#
|
|
43
|
+
STATUS_IDLE = :idle
|
|
44
|
+
|
|
45
|
+
# [public]
|
|
46
|
+
#
|
|
47
|
+
STATUS_PAUSED = :paused
|
|
48
|
+
|
|
49
|
+
# [public]
|
|
50
|
+
#
|
|
51
|
+
attr_reader :state, :status, :error, :reactor
|
|
31
52
|
|
|
32
53
|
# [public]
|
|
33
54
|
#
|
|
@@ -46,7 +67,7 @@ module Goru
|
|
|
46
67
|
@block.call(self)
|
|
47
68
|
rescue => error
|
|
48
69
|
@error = error
|
|
49
|
-
set_status(
|
|
70
|
+
set_status(STATUS_ERRORED)
|
|
50
71
|
trigger(error)
|
|
51
72
|
end
|
|
52
73
|
|
|
@@ -54,7 +75,7 @@ module Goru
|
|
|
54
75
|
#
|
|
55
76
|
def finished(result = nil)
|
|
56
77
|
@result = result
|
|
57
|
-
set_status(
|
|
78
|
+
set_status(STATUS_FINISHED)
|
|
58
79
|
|
|
59
80
|
throw :continue
|
|
60
81
|
end
|
|
@@ -69,7 +90,7 @@ module Goru
|
|
|
69
90
|
#
|
|
70
91
|
def result
|
|
71
92
|
case @status
|
|
72
|
-
when
|
|
93
|
+
when STATUS_ERRORED
|
|
73
94
|
raise @error
|
|
74
95
|
else
|
|
75
96
|
@result
|
|
@@ -79,9 +100,9 @@ module Goru
|
|
|
79
100
|
# [public]
|
|
80
101
|
#
|
|
81
102
|
def sleep(seconds)
|
|
82
|
-
set_status(
|
|
103
|
+
set_status(STATUS_IDLE)
|
|
83
104
|
@reactor.asleep_for(seconds) do
|
|
84
|
-
set_status(
|
|
105
|
+
set_status(STATUS_READY)
|
|
85
106
|
end
|
|
86
107
|
|
|
87
108
|
throw :continue
|
|
@@ -90,7 +111,25 @@ module Goru
|
|
|
90
111
|
# [public]
|
|
91
112
|
#
|
|
92
113
|
def ready?
|
|
93
|
-
@status ==
|
|
114
|
+
@status == STATUS_READY
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# [public]
|
|
118
|
+
#
|
|
119
|
+
def finished?
|
|
120
|
+
@status == STATUS_ERRORED || @status == STATUS_FINISHED
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# [public]
|
|
124
|
+
#
|
|
125
|
+
def pause
|
|
126
|
+
set_status(STATUS_PAUSED)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# [public]
|
|
130
|
+
#
|
|
131
|
+
def resume
|
|
132
|
+
set_status(STATUS_READY)
|
|
94
133
|
end
|
|
95
134
|
|
|
96
135
|
# [public]
|
|
@@ -103,8 +142,10 @@ module Goru
|
|
|
103
142
|
# [public]
|
|
104
143
|
#
|
|
105
144
|
private def status_changed
|
|
145
|
+
@observers.each(&:call)
|
|
146
|
+
|
|
106
147
|
case @status
|
|
107
|
-
when
|
|
148
|
+
when STATUS_ERRORED, STATUS_FINISHED
|
|
108
149
|
@reactor&.routine_finished(self)
|
|
109
150
|
end
|
|
110
151
|
end
|
|
@@ -114,5 +155,17 @@ module Goru
|
|
|
114
155
|
def adopted
|
|
115
156
|
# noop
|
|
116
157
|
end
|
|
158
|
+
|
|
159
|
+
# [public]
|
|
160
|
+
#
|
|
161
|
+
def add_observer(observer = nil, &block)
|
|
162
|
+
@observers << (block || observer.method(:routine_status_changed))
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# [public]
|
|
166
|
+
#
|
|
167
|
+
def remove_observer(observer)
|
|
168
|
+
@observers.delete(observer)
|
|
169
|
+
end
|
|
117
170
|
end
|
|
118
171
|
end
|
|
@@ -16,11 +16,11 @@ module Goru
|
|
|
16
16
|
|
|
17
17
|
private def update_status
|
|
18
18
|
status = if @channel.any?
|
|
19
|
-
|
|
19
|
+
Routine::STATUS_READY
|
|
20
20
|
elsif @channel.closed?
|
|
21
|
-
|
|
21
|
+
Routine::STATUS_FINISHED
|
|
22
22
|
else
|
|
23
|
-
|
|
23
|
+
Routine::STATUS_IDLE
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
set_status(status)
|
|
@@ -16,11 +16,11 @@ module Goru
|
|
|
16
16
|
|
|
17
17
|
private def update_status
|
|
18
18
|
status = if @channel.full?
|
|
19
|
-
|
|
19
|
+
Routine::STATUS_IDLE
|
|
20
20
|
elsif @channel.closed?
|
|
21
|
-
|
|
21
|
+
Routine::STATUS_FINISHED
|
|
22
22
|
else
|
|
23
|
-
|
|
23
|
+
Routine::STATUS_READY
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
set_status(status)
|
data/lib/goru/routines/io.rb
CHANGED
|
@@ -19,6 +19,10 @@ module Goru
|
|
|
19
19
|
@monitor = nil
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
# [public]
|
|
23
|
+
#
|
|
24
|
+
STATUS_IO_READY = :io_ready
|
|
25
|
+
|
|
22
26
|
# [public]
|
|
23
27
|
#
|
|
24
28
|
attr_reader :io, :intent
|
|
@@ -28,7 +32,7 @@ module Goru
|
|
|
28
32
|
# [public]
|
|
29
33
|
#
|
|
30
34
|
def adopted
|
|
31
|
-
set_status(
|
|
35
|
+
set_status(Routine::STATUS_READY)
|
|
32
36
|
end
|
|
33
37
|
|
|
34
38
|
# [public]
|
|
@@ -39,11 +43,11 @@ module Goru
|
|
|
39
43
|
#
|
|
40
44
|
@monitor&.interests = nil
|
|
41
45
|
|
|
42
|
-
set_status(
|
|
46
|
+
set_status(STATUS_IO_READY)
|
|
43
47
|
end
|
|
44
48
|
|
|
45
|
-
READY_STATUSES = [
|
|
46
|
-
READY_BRIDGE_STATUSES = [nil,
|
|
49
|
+
READY_STATUSES = [STATUS_IO_READY, Routine::STATUS_READY].freeze
|
|
50
|
+
READY_BRIDGE_STATUSES = [nil, Bridge::STATUS_READY].freeze
|
|
47
51
|
|
|
48
52
|
# [public]
|
|
49
53
|
#
|
|
@@ -151,7 +155,7 @@ module Goru
|
|
|
151
155
|
|
|
152
156
|
private def status_changed
|
|
153
157
|
case @status
|
|
154
|
-
when
|
|
158
|
+
when Routine::STATUS_FINISHED
|
|
155
159
|
@reactor&.deregister(self)
|
|
156
160
|
end
|
|
157
161
|
|
data/lib/goru/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: goru
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Bryan Powell
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-07-
|
|
11
|
+
date: 2023-07-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: core-extension
|