ione 1.2.0.pre3 → 1.2.0.pre4

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 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