core-async 0.2.0 → 0.6.0

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: 36564cdb777065399358b390e554b89b367902f9d065ed3def243a0816b17049
4
- data.tar.gz: ec4cb82ad1b7a97d60af94fc4be07aca732f03f9fe5db91367d7628631d79bc7
3
+ metadata.gz: 32453e0ff3a28813b566b881be5fc88da0143249ac9164a332218a4c94799574
4
+ data.tar.gz: cb436adf5261d76f982b032996044ac379b1487b8e504a80641cc6c80aa5ba7a
5
5
  SHA512:
6
- metadata.gz: 7cf03e8b149e9e0d5185d907025fd833c6d63074be1461970862ae138f3f3744e361422068d8bd4e8696f28fe459d65d7f3e2caa153c2b0f5b374f8d550e21da
7
- data.tar.gz: 11b9a8ea0a25975bbf9f92ca7b41c1f0db6b2a7ae2ab0a16bbf6d3057d6d6add5875b30b3646e4028747f4eebb8863769fe8403a825c6e5a8a71cd25e677de22
6
+ metadata.gz: 55253a5d64873e32794e5fa9fbc7497e1db49c99eeb0f673ce4ebdc70f33360ef547d5f676c1f13b3bef1f376493659305d1329753d758e5e3fd9ea0c20794c8
7
+ data.tar.gz: 80a4872f6d51426a1518f5b904413f5ed6296382a3d508268c04df3011bc7e28feb11f01f9df58e3998bc41db9afc53597a7d117df484f8eba35011aff019ce2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,37 @@
1
+ ## [v0.6.0](https://github.com/metabahn/corerb/releases/tag/2021-05-20)
2
+
3
+ *released on 2021-05-20*
4
+
5
+ * `fix` [#28](https://github.com/metabahn/corerb/pull/28) Turn off the console logger in all contexts ([bryanp](https://github.com/bryanp))
6
+ * `chg` [#27](https://github.com/metabahn/corerb/pull/27) Propagate throws from async contexts ([bryanp](https://github.com/bryanp))
7
+
8
+ ## [v0.5.0](https://github.com/metabahn/corerb/releases/tag/2021-03-26)
9
+
10
+ *released on 2021-03-26*
11
+
12
+ * `chg` [#25](https://github.com/metabahn/corerb/pull/25) Privatize async behavior ([bryanp](https://github.com/bryanp))
13
+ * `add` [#24](https://github.com/metabahn/corerb/pull/24) Add Is::Async#cancel ([bryanp](https://github.com/bryanp))
14
+ * `fix` [#23](https://github.com/metabahn/corerb/pull/23) Improve control flow during async enumeration / collection building ([bryanp](https://github.com/bryanp))
15
+ * `fix` [#22](https://github.com/metabahn/corerb/pull/22) Expose errors that occur when building a collection ([bryanp](https://github.com/bryanp))
16
+
17
+ ## [v0.4.0](https://github.com/metabahn/corerb/releases/tag/2021-03-17.1)
18
+
19
+ *released on 2021-03-17*
20
+
21
+ * `chg` [#21](https://github.com/metabahn/corerb/pull/21) Cancel async futures without waiting ([bryanp](https://github.com/bryanp))
22
+
23
+ ## [v0.3.0](https://github.com/metabahn/corerb/releases/tag/2021-03-17)
24
+
25
+ *released on 2021-03-17*
26
+
27
+ * `add` [#20](https://github.com/metabahn/corerb/pull/20) Allow futures to be canceled ([bryanp](https://github.com/bryanp))
28
+
29
+ ## [v0.2.1](https://github.com/metabahn/corerb/releases/tag/2021-03-05)
30
+
31
+ *released on 2021-03-05*
32
+
33
+ * `fix` [#18](https://github.com/metabahn/corerb/pull/18) Surface errors that occur in tasks running within an async reactor ([bryanp](https://github.com/bryanp))
34
+
1
35
  ## [v0.2.0](https://github.com/metabahn/corerb/releases/tag/2021-03-05)
2
36
 
3
37
  *released on 2021-03-05*
@@ -1,4 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "async"
4
- Console.logger.off!
4
+
5
+ # Turn the console logger off everywhere.
6
+ #
7
+ ENV["CONSOLE_LOGGER"] ||= "5"
@@ -12,17 +12,26 @@ module Core
12
12
  #
13
13
  def build(object)
14
14
  aware do
15
+ errored, stopped = false
16
+
15
17
  values = object.map { |value|
18
+ break if errored || stopped
19
+
16
20
  async do
17
21
  if block_given?
18
22
  yield value
19
23
  else
20
24
  value
21
25
  end
26
+ rescue LocalJumpError
27
+ stopped = true
28
+ rescue => error
29
+ errored = true
30
+ raise error
22
31
  end
23
32
  }
24
33
 
25
- new(values)
34
+ new(values) if values
26
35
  end
27
36
  end
28
37
  end
@@ -24,20 +24,19 @@ module Core
24
24
  end
25
25
 
26
26
  await do
27
- errored = false
27
+ errored, stopped = false
28
+
28
29
  @object.each do |value|
29
- break if errored
30
-
31
- async {
32
- begin
33
- yield value
34
- rescue => error
35
- errored = true
36
- raise error
37
- ensure
38
- defer
39
- end
40
- }
30
+ break if errored || stopped
31
+
32
+ async do
33
+ yield value
34
+ rescue LocalJumpError
35
+ stopped = true
36
+ rescue => error
37
+ errored = true
38
+ raise error
39
+ end
41
40
  end
42
41
  end
43
42
  end
@@ -10,7 +10,7 @@ module Core
10
10
  @error = nil
11
11
  end
12
12
 
13
- # [public] Wait on the task to complete, returning self.
13
+ # [public] Wait on the future to resolve, returning self.
14
14
  #
15
15
  def wait
16
16
  unless @error
@@ -20,6 +20,16 @@ module Core
20
20
  self
21
21
  end
22
22
 
23
+ # [public] Attempt to cancel the future, returns true if successful.
24
+ #
25
+ def cancel
26
+ if pending?
27
+ @task.stop
28
+ end
29
+
30
+ self
31
+ end
32
+
23
33
  # [public] Return the result, blocking until available.
24
34
  #
25
35
  def result
@@ -30,6 +40,8 @@ module Core
30
40
  wait_all(@task)
31
41
 
32
42
  resolve_value(@task.result)
43
+ rescue UncaughtThrowError => error
44
+ throw error.tag, error.value
33
45
  rescue => error
34
46
  @error = error
35
47
 
@@ -68,6 +80,8 @@ module Core
68
80
  case @task.status
69
81
  when :running
70
82
  :pending
83
+ when :stopped
84
+ :canceled
71
85
  when :failed
72
86
  :failed
73
87
  when :complete
@@ -91,6 +105,12 @@ module Core
91
105
  status == :failed
92
106
  end
93
107
 
108
+ # [public] Return `true` if canceled.
109
+ #
110
+ def canceled?
111
+ status == :canceled
112
+ end
113
+
94
114
  # [public] Return `true` if complete.
95
115
  #
96
116
  def complete?
@@ -33,7 +33,9 @@ module Core
33
33
  @runnable = ::Async::Reactor.new
34
34
 
35
35
  @runnable.run {
36
- yield self
36
+ async {
37
+ yield self
38
+ }.result
37
39
  }.wait
38
40
  end
39
41
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Core
4
4
  module Async
5
- VERSION = "0.2.0"
5
+ VERSION = "0.6.0"
6
6
 
7
7
  def self.version
8
8
  VERSION
data/lib/is/async.rb CHANGED
@@ -29,7 +29,7 @@ module Is
29
29
 
30
30
  # [public] Call behavior synchronously but within an async context, waiting on the result.
31
31
  #
32
- def await
32
+ private def await
33
33
  if (task = ::Async::Task.current?)
34
34
  reference = task.async { |current|
35
35
  begin
@@ -47,11 +47,13 @@ module Is
47
47
  }.result
48
48
  }.wait
49
49
  end
50
+ rescue UncaughtThrowError => error
51
+ throw error.tag, error.value
50
52
  end
51
53
 
52
54
  # [public] Call behavior within an async context without additional nesting.
53
55
  #
54
- def aware
56
+ private def aware
55
57
  if ::Async::Task.current?
56
58
  yield
57
59
  else
@@ -63,7 +65,7 @@ module Is
63
65
 
64
66
  # [public] Sleeps for `seconds` in a proper async context.
65
67
  #
66
- def sleep(seconds)
68
+ private def sleep(seconds)
67
69
  internal_await do |task|
68
70
  task.sleep(seconds)
69
71
  end
@@ -73,29 +75,45 @@ module Is
73
75
  #
74
76
  # Raises `Core::Async::Timeout` if execution exceeds `seconds`.
75
77
  #
76
- def timeout(seconds, &block)
78
+ private def timeout(seconds)
77
79
  internal_await do |task|
80
+ timed_task = internal_async {
81
+ yield
82
+ }
83
+
78
84
  if seconds && seconds > 0
79
85
  task.with_timeout(seconds, Core::Async::Timeout) do
80
- yield
86
+ timed_task.wait
81
87
  end
82
88
  else
83
- yield
89
+ timed_task.wait
84
90
  end
91
+ ensure
92
+ timed_task&.stop
85
93
  end
94
+ rescue UncaughtThrowError => error
95
+ throw error.tag, error.value
86
96
  end
87
97
 
88
98
  # [public] Yields control to allow other fibers to execute.
89
99
  #
90
- def defer
100
+ private def defer
91
101
  if (task = ::Async::Task.current?)
92
102
  task.yield
93
103
  end
94
104
  end
95
105
 
106
+ # [public] Cancels the current async behavior if in progress.
107
+ #
108
+ private def cancel
109
+ if (task = ::Async::Task.current?)
110
+ task.stop
111
+ end
112
+ end
113
+
96
114
  # [public] Resolves a potential future to a final result.
97
115
  #
98
- def resolve(value)
116
+ private def resolve(value)
99
117
  case value
100
118
  when Core::Async::Future
101
119
  value.result
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: core-async
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.6.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: 2021-03-05 00:00:00.000000000 Z
11
+ date: 2021-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -54,14 +54,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - ">="
56
56
  - !ruby/object:Gem::Version
57
- version: 2.5.0
57
+ version: 2.6.7
58
58
  required_rubygems_version: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  requirements: []
64
- rubygems_version: 3.2.4
64
+ rubygems_version: 3.2.15
65
65
  signing_key:
66
66
  specification_version: 4
67
67
  summary: Makes Ruby objects async-aware.