async 1.18.0 → 1.19.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: 36f2b61b71527d107240403ca7ec078814ed7638bd18cf6ef14b02003d6bfc5d
4
- data.tar.gz: 0de32e45303f0ce6514c685169422e6cc22cc0b49a497739e183964414430f7d
3
+ metadata.gz: 0bbe9b738c758dc531ae3a13f10a4a5bdcfdadaf29e3dc51bc11e2daca28781d
4
+ data.tar.gz: 31872ca49209a1038eb02ec0497bf968c68c84122c81f3bafd3b87773c653f1d
5
5
  SHA512:
6
- metadata.gz: f09914dff9e1eccff8b2b6849cd111fa43a6c2db9ff1bc43db02aeb1fa82059bccef2728ec93eecc549486b00012f97268d46686aed23ad375704ec08ca54e71
7
- data.tar.gz: 259262665baaee81c4ff1d056649e14e77bc891b63936eef3dbfab1124408ee8cbd9442ebbb27903430a645bbeb2b4856c7bad333375d57a51cb2608b919092a
6
+ metadata.gz: 2caef4acc794a33d79a7f74a7bf98642d5b882e406a31cca62a7714fa4933123ff9565c769fe2aaf88e71f1ae34499cff847402fa07194c85dd70f61fa19b594
7
+ data.tar.gz: 93a95a79cd6db4646108863121b60406f82e2ab4142ebba4108ac0cc7b23eec271d5a1cf4f1c9c7d3939ae17e3aba402f6f729a7bc3d56770fae49dac430ebe3
data/.gitignore CHANGED
@@ -1,21 +1,14 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- .tags*
19
- documentation/run/*
20
- documentation/public/code/*
21
- .rspec_status
1
+ .tags
2
+
3
+ /.bundle/
4
+ /.yardoc
5
+ /Gemfile.lock
6
+ /_yardoc/
7
+ /coverage/
8
+ /doc/
9
+ /pkg/
10
+ /spec/reports/
11
+ /tmp/
12
+
13
+ .rspec_status
14
+ .covered.db
@@ -29,5 +29,6 @@ matrix:
29
29
  - rvm: truffleruby
30
30
  - rvm: ruby-head
31
31
  allow_failures:
32
+ - rvm: truffleruby
32
33
  - rvm: ruby-head
33
34
  - rvm: jruby-head
@@ -33,6 +33,9 @@ module Async
33
33
  # The maximum number of tasks that can acquire the semaphore.
34
34
  attr :limit
35
35
 
36
+ # The tasks waiting on this semaphore.
37
+ attr :waiting
38
+
36
39
  # Is the semaphore currently acquired?
37
40
  def empty?
38
41
  @count.zero?
@@ -95,12 +98,10 @@ module Async
95
98
  def wait
96
99
  fiber = Fiber.current
97
100
 
98
- while blocking?
101
+ if blocking?
99
102
  @waiting << fiber
100
- Task.yield
103
+ Task.yield while blocking?
101
104
  end
102
-
103
- # ensure when raise, throw
104
105
  rescue Exception
105
106
  @waiting.delete(fiber)
106
107
  raise
@@ -136,7 +136,9 @@ module Async
136
136
  def stop
137
137
  @children&.each(&:stop)
138
138
 
139
- if @fiber.alive?
139
+ if self.current?
140
+ raise Stop, "Stopping current fiber!"
141
+ elsif @fiber.alive?
140
142
  @fiber.resume(Stop.new)
141
143
  end
142
144
  end
@@ -154,6 +156,10 @@ module Async
154
156
  Thread.current[:async_task]
155
157
  end
156
158
 
159
+ def current?
160
+ self.equal?(Thread.current[:async_task])
161
+ end
162
+
157
163
  # Check if the task is running.
158
164
  # @return [Boolean]
159
165
  def running?
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Async
22
- VERSION = "1.18.0"
22
+ VERSION = "1.19.0"
23
23
  end
@@ -18,7 +18,9 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
+ require 'async'
21
22
  require 'async/queue'
23
+ require 'async/rspec'
22
24
 
23
25
  require_relative 'condition_examples'
24
26
 
@@ -35,6 +37,17 @@ RSpec.shared_context Async::Queue do
35
37
  expect(subject.dequeue).to be == j
36
38
  end
37
39
  end
40
+
41
+ it 'can dequeue items asynchronously' do
42
+ reactor.async do |task|
43
+ subject << 1
44
+ subject << nil
45
+ end
46
+
47
+ subject.async do |task, item|
48
+ expect(item).to be 1
49
+ end
50
+ end
38
51
  end
39
52
 
40
53
  RSpec.describe Async::Queue do
@@ -19,8 +19,7 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  require 'async/semaphore'
22
-
23
- require_relative 'condition_examples'
22
+ require 'async/rspec'
24
23
 
25
24
  RSpec.describe Async::Semaphore do
26
25
  include_context Async::RSpec::Reactor
@@ -82,6 +81,20 @@ RSpec.describe Async::Semaphore do
82
81
  end
83
82
  end
84
83
 
84
+ context '#waiting' do
85
+ subject {Async::Semaphore.new(0)}
86
+ it 'handles exceptions thrown while waiting' do
87
+ expect do
88
+ reactor.with_timeout(0.1) do
89
+ subject.acquire do
90
+ end
91
+ end
92
+ end.to raise_error(Async::TimeoutError)
93
+
94
+ expect(subject.waiting).to be_empty
95
+ end
96
+ end
97
+
85
98
  context '#count' do
86
99
  it 'should count number of current acquisitions' do
87
100
  expect(subject.count).to be == 0
@@ -18,7 +18,7 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require 'async/reactor'
21
+ require 'async'
22
22
  require 'async/clock'
23
23
 
24
24
  RSpec.describe Async::Task do
@@ -33,6 +33,17 @@ RSpec.describe Async::Task do
33
33
  end
34
34
  end
35
35
 
36
+ describe '#current?' do
37
+ it "can check if it is the currently running task" do
38
+ task = reactor.async do |task|
39
+ expect(task).to be_current
40
+ task.sleep(0.1)
41
+ end
42
+
43
+ expect(task).to_not be_current
44
+ end
45
+ end
46
+
36
47
  describe '#async' do
37
48
  it "can start child async tasks" do
38
49
  child = nil
@@ -134,6 +145,20 @@ RSpec.describe Async::Task do
134
145
  task.stop
135
146
 
136
147
  expect(state).to be == :started
148
+ expect(task).to be_stopped
149
+ end
150
+
151
+ it "can stop current task" do
152
+ state = nil
153
+
154
+ task = reactor.async do |task|
155
+ state = :started
156
+ task.stop
157
+ state = :finished
158
+ end
159
+
160
+ expect(state).to be == :started
161
+ expect(task).to be_stopped
137
162
  end
138
163
 
139
164
  it "should kill direct child" do
@@ -0,0 +1,39 @@
1
+ # Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'async'
22
+
23
+ RSpec.describe Async do
24
+ describe '#Async' do
25
+ it "can run an asynchronous task" do
26
+ Async do |task|
27
+ expect(task).to be_a Async::Task
28
+ end
29
+ end
30
+ end
31
+
32
+ describe '.run' do
33
+ it "can run an asynchronous task" do
34
+ Async.run do |task|
35
+ expect(task).to be_a Async::Task
36
+ end
37
+ end
38
+ end
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.18.0
4
+ version: 1.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-13 00:00:00.000000000 Z
11
+ date: 2019-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nio4r
@@ -180,6 +180,7 @@ files:
180
180
  - spec/async/semaphore_spec.rb
181
181
  - spec/async/task_spec.rb
182
182
  - spec/async/wrapper_spec.rb
183
+ - spec/async_spec.rb
183
184
  - spec/enumerator_spec.rb
184
185
  - spec/spec_helper.rb
185
186
  homepage: https://github.com/socketry/async
@@ -219,5 +220,6 @@ test_files:
219
220
  - spec/async/semaphore_spec.rb
220
221
  - spec/async/task_spec.rb
221
222
  - spec/async/wrapper_spec.rb
223
+ - spec/async_spec.rb
222
224
  - spec/enumerator_spec.rb
223
225
  - spec/spec_helper.rb