ione 1.2.0.pre3 → 1.2.0.pre4

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
  SHA1:
3
- metadata.gz: 0cfb6a38285dd1cd80c9120ba6df4416a04607d4
4
- data.tar.gz: 456d6419e88e0845dbd4b648c48acbb83ed3ad52
3
+ metadata.gz: b0d198d610290a10e580f755f216bbae8ccca0ab
4
+ data.tar.gz: ada926b95e4a03d55ffad99687ca9f468d1cdd1f
5
5
  SHA512:
6
- metadata.gz: 7620752ee5ab3f1252acec253cd39747c4d15b5c5f1f635ce1ea271369ab76bfae2cef24769c7957d868528a8d86a0a976948c2c5e2b27e905f931cd9c4fe141
7
- data.tar.gz: f45766a8c27a944d68121a062c142da08539b38277b51c280c849324817794aea002d37980e049169704479045847bc60d63741dc4ecbe5c5c2732ab36e2db24
6
+ metadata.gz: 85e98209e280e3fcd0ca52577ffde6fdbe337191af45830bf9b43d3ded0839aa3ef902267da22abb62f937a2d3321ca0abaf15cd66a0920dfe2a9dc3357d2f19
7
+ data.tar.gz: e5eac3de0c0024e20bad63f82a32a57973d50081df75bf789f7d76bfda413bb8a180bb5ae6919be3aff91c4fa809d8596bfa26a02b0f3bc995b023801cbf3133
data/lib/ione/future.rb CHANGED
@@ -91,10 +91,14 @@ module Ione
91
91
  # @return [Ione::Future<Array>] an array of the values of the constituent
92
92
  # futures
93
93
  def all(*futures)
94
- return resolved([]) if futures.empty?
95
- futures = futures.size == 1 && futures.first.is_a?(Enumerable) ? futures.first : futures
96
- return futures.first.map { |v| [v] } if futures.is_a?(Array) && futures.size == 1
97
- CombinedFuture.new(futures)
94
+ if futures.size == 1 && (fs = futures.first).is_a?(Enumerable)
95
+ futures = fs
96
+ end
97
+ if futures.count == 0
98
+ resolved([])
99
+ else
100
+ CombinedFuture.new(futures)
101
+ end
98
102
  end
99
103
 
100
104
  # Returns a future which will be resolved with the value of the first
@@ -741,7 +745,7 @@ module Ione
741
745
  true
742
746
  end
743
747
 
744
- def resolvesd?
748
+ def resolved?
745
749
  true
746
750
  end
747
751
 
@@ -19,7 +19,10 @@ module Ione
19
19
  #
20
20
  # @return [true, false] returns false if the connection was already closed
21
21
  def close(cause=nil)
22
- return false if @state == :closed
22
+ @lock.synchronize do
23
+ return false if @state == :closed
24
+ @state = :closed
25
+ end
23
26
  if @io
24
27
  begin
25
28
  @io.close
@@ -28,7 +31,6 @@ module Ione
28
31
  # nothing to do, the socket was most likely already closed
29
32
  end
30
33
  end
31
- @state = :closed
32
34
  if cause && !cause.is_a?(IoError)
33
35
  cause = ConnectionClosedError.new(cause.message)
34
36
  end
@@ -45,7 +45,7 @@ module Ione
45
45
  new_data = @io.read_nonblock(2**16)
46
46
  @data_listener.call(new_data) if @data_listener
47
47
  end
48
- rescue IO::WaitReadable
48
+ rescue IO::WaitReadable, IO::WaitWritable
49
49
  # no more data available
50
50
  rescue => e
51
51
  close(e)
@@ -59,6 +59,8 @@ module Ione
59
59
  @data_listener.call(new_data) if @data_listener
60
60
  read_size = @io.pending
61
61
  end
62
+ rescue IO::WaitReadable, IO::WaitWritable
63
+ # no more data available
62
64
  rescue => e
63
65
  close(e)
64
66
  end
data/lib/ione/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Ione
4
- VERSION = '1.2.0.pre3'.freeze
4
+ VERSION = '1.2.0.pre4'.freeze
5
5
  end
@@ -979,6 +979,14 @@ module Ione
979
979
  Future.all.value.should == []
980
980
  end
981
981
 
982
+ it 'completes with an empty list when an empty list is given' do
983
+ Future.all([]).value.should == []
984
+ end
985
+
986
+ it 'completes with an empty list when an empty enumerable is given' do
987
+ Future.all([].to_enum).value.should == []
988
+ end
989
+
982
990
  it 'completes with a list of one item when a single future is given' do
983
991
  f = Future.resolved(1)
984
992
  Future.all(f).value.should == [1]
@@ -1000,6 +1008,14 @@ module Ione
1000
1008
  f.value.should have(3).items
1001
1009
  end
1002
1010
 
1011
+ it 'accepts an enumerable of one future' do
1012
+ promises = [Promise.new]
1013
+ futures = promises.map(&:future).to_enum
1014
+ f = Future.all(futures)
1015
+ promises.each(&:fulfill)
1016
+ f.value.should have(1).item
1017
+ end
1018
+
1003
1019
  it 'accepts anything that implements #on_complete as futures' do
1004
1020
  ff1, ff2, ff3 = double, double, double
1005
1021
  ff1.stub(:on_complete) { |&listener| listener.call(1, nil) }
@@ -153,6 +153,24 @@ module Ione
153
153
  end
154
154
  end
155
155
 
156
+ it 'does not close the socket when #read_nonblock raises IO::WaitWritable' do
157
+ error = OpenSSL::SSL::SSLError.new
158
+ error.extend(IO::WaitWritable) unless error.is_a?(IO::WaitWritable)
159
+ ssl_socket.stub(:read_nonblock).and_raise(error)
160
+ handler.connect
161
+ handler.read
162
+ ssl_socket.should_not have_received(:close)
163
+ end
164
+
165
+ it 'does not close the socket when #read_nonblock raises IO::WaitReadable' do
166
+ error = OpenSSL::SSL::SSLError.new
167
+ error.extend(IO::WaitReadable) unless error.is_a?(IO::WaitReadable)
168
+ ssl_socket.stub(:read_nonblock).and_raise(error)
169
+ handler.connect
170
+ handler.read
171
+ ssl_socket.should_not have_received(:close)
172
+ end
173
+
156
174
  it 'closes the connection when an error occurs' do
157
175
  ssl_socket.stub(:read_nonblock).and_raise('boork')
158
176
  handler.connect
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ione
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0.pre3
4
+ version: 1.2.0.pre4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theo Hultberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-11 00:00:00.000000000 Z
11
+ date: 2014-09-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Reactive programming framework for Ruby, painless evented IO, futures
14
14
  and an efficient byte buffer