ione 1.2.2 → 1.2.3
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/lib/ione/byte_buffer.rb +11 -3
- data/lib/ione/future.rb +62 -48
- data/lib/ione/io/io_reactor.rb +1 -1
- data/lib/ione/version.rb +1 -1
- data/spec/ione/byte_buffer_spec.rb +14 -0
- data/spec/ione/future_spec.rb +12 -0
- data/spec/ione/io/io_reactor_spec.rb +17 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3ef9ccb78957f99a401f9d3808fa74ea940ff17
|
4
|
+
data.tar.gz: 081d0432ba2a6960d84ee527c9ff10474b4ce31e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c4624c05b932671afdd0c8406e345cd3476bfad89b2118fabf3ce4101ba3849dc98ad0f32168c7c8b255c0f20bec9961d016f469a516dae20db7792294829ca
|
7
|
+
data.tar.gz: 6a1ec1a33dbdb4f9bdaf0faffd68e4e23019763ab4a3a90e232144ebea228eff1d865ec6094b323b908fc63e419c993cb02183acb39f7f5d5632dc735ab3b0f7
|
data/lib/ione/byte_buffer.rb
CHANGED
@@ -179,10 +179,12 @@ module Ione
|
|
179
179
|
swap_buffers
|
180
180
|
end
|
181
181
|
read_buffer_length = @read_buffer.bytesize
|
182
|
-
if start_index
|
182
|
+
if start_index + substring.bytesize <= read_buffer_length - @offset && (index = @read_buffer.index(substring, @offset + start_index))
|
183
183
|
index - @offset
|
184
|
-
elsif
|
185
|
-
|
184
|
+
elsif start_index + substring.bytesize <= read_buffer_length - @offset + @write_buffer.bytesize
|
185
|
+
merge_read_buffer
|
186
|
+
start_index = read_buffer_length - substring.bytesize if read_buffer_length - substring.bytesize > start_index
|
187
|
+
@read_buffer.index(substring, start_index)
|
186
188
|
else
|
187
189
|
nil
|
188
190
|
end
|
@@ -298,5 +300,11 @@ module Ione
|
|
298
300
|
@read_buffer = @write_buffer
|
299
301
|
@write_buffer = ''
|
300
302
|
end
|
303
|
+
|
304
|
+
def merge_read_buffer
|
305
|
+
@read_buffer = @read_buffer[@offset, @read_buffer.length - @offset] << @write_buffer
|
306
|
+
@write_buffer = ''
|
307
|
+
@offset = 0
|
308
|
+
end
|
301
309
|
end
|
302
310
|
end
|
data/lib/ione/future.rb
CHANGED
@@ -209,6 +209,8 @@ module Ione
|
|
209
209
|
end
|
210
210
|
if futures.count == 0
|
211
211
|
resolved([])
|
212
|
+
elsif (failed = futures.find { |f| f.respond_to?(:failed?) && f.failed? })
|
213
|
+
failed
|
212
214
|
else
|
213
215
|
CombinedFuture.new(futures)
|
214
216
|
end
|
@@ -231,6 +233,7 @@ module Ione
|
|
231
233
|
if futures.size == 1 && (fs = futures.first).is_a?(Enumerable)
|
232
234
|
*futures = *fs
|
233
235
|
end
|
236
|
+
futures.reject! { |f| f.respond_to?(:resolved?) && f.resolved? }
|
234
237
|
if futures.count == 0
|
235
238
|
ResolvedFuture::NIL
|
236
239
|
elsif futures.count == 1
|
@@ -262,7 +265,9 @@ module Ione
|
|
262
265
|
futures = fs
|
263
266
|
end
|
264
267
|
if futures.count == 0
|
265
|
-
|
268
|
+
ResolvedFuture::NIL
|
269
|
+
elsif (done = futures.find { |f| f.respond_to?(:resolved?) && f.resolved? })
|
270
|
+
done
|
266
271
|
else
|
267
272
|
FirstFuture.new(futures)
|
268
273
|
end
|
@@ -874,64 +879,56 @@ module Ione
|
|
874
879
|
def initialize(futures, initial_value, reducer)
|
875
880
|
super()
|
876
881
|
@futures = Array(futures)
|
877
|
-
@
|
878
|
-
@initial_value = initial_value
|
879
|
-
@accumulator = initial_value.nil? ? NO_INITIAL_VALUE : initial_value
|
882
|
+
@initial_value = initial_value.nil? ? NO_INITIAL_VALUE : initial_value
|
880
883
|
@reducer = reducer
|
881
884
|
end
|
882
|
-
|
883
|
-
private
|
884
|
-
|
885
|
-
def reduce_one(value)
|
886
|
-
unless failed?
|
887
|
-
@lock.lock
|
888
|
-
begin
|
889
|
-
if @accumulator.equal?(NO_INITIAL_VALUE)
|
890
|
-
@accumulator = value
|
891
|
-
else
|
892
|
-
@accumulator = @reducer.call(@accumulator, value)
|
893
|
-
end
|
894
|
-
@remaining -= 1
|
895
|
-
rescue => e
|
896
|
-
@lock.unlock
|
897
|
-
fail(e)
|
898
|
-
else
|
899
|
-
@lock.unlock
|
900
|
-
end
|
901
|
-
unless failed?
|
902
|
-
if @remaining == 0
|
903
|
-
resolve(@accumulator)
|
904
|
-
:done
|
905
|
-
else
|
906
|
-
:continue
|
907
|
-
end
|
908
|
-
end
|
909
|
-
end
|
910
|
-
end
|
911
885
|
end
|
912
886
|
|
913
887
|
# @private
|
914
888
|
class OrderedReducingFuture < ReducingFuture
|
915
889
|
def initialize(futures, initial_value, reducer)
|
916
890
|
super
|
917
|
-
if @
|
918
|
-
|
891
|
+
if @futures.empty?
|
892
|
+
resolve(@initial_value.equal?(NO_INITIAL_VALUE) ? nil : @initial_value)
|
893
|
+
elsif @initial_value.equal?(NO_INITIAL_VALUE)
|
894
|
+
@futures.shift.on_complete(&method(:reduce_next))
|
919
895
|
else
|
920
|
-
|
896
|
+
reduce_next(@initial_value, nil)
|
921
897
|
end
|
922
898
|
end
|
923
899
|
|
924
900
|
private
|
925
901
|
|
926
|
-
def reduce_next(
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
902
|
+
def reduce_next(accumulator, e)
|
903
|
+
if e
|
904
|
+
@futures = nil
|
905
|
+
fail(e)
|
906
|
+
elsif @futures.empty?
|
907
|
+
@futures = nil
|
908
|
+
resolve(accumulator)
|
909
|
+
else
|
910
|
+
outer = Thread.current
|
911
|
+
looping = more = true
|
912
|
+
while more
|
913
|
+
more = false
|
914
|
+
@futures.shift.on_complete do |v, ee|
|
915
|
+
if ee
|
916
|
+
reduce_next(nil, ee)
|
917
|
+
else
|
918
|
+
begin
|
919
|
+
accumulator = @reducer.call(accumulator, v)
|
920
|
+
if @futures.empty? || !looping || !Thread.current.equal?(outer)
|
921
|
+
reduce_next(accumulator, nil)
|
922
|
+
else
|
923
|
+
more = true
|
924
|
+
end
|
925
|
+
rescue => eee
|
926
|
+
reduce_next(nil, eee)
|
927
|
+
end
|
928
|
+
end
|
933
929
|
end
|
934
930
|
end
|
931
|
+
looping = false
|
935
932
|
end
|
936
933
|
end
|
937
934
|
end
|
@@ -940,20 +937,37 @@ module Ione
|
|
940
937
|
class UnorderedReducingFuture < ReducingFuture
|
941
938
|
def initialize(futures, initial_value, reducer)
|
942
939
|
super
|
943
|
-
if @
|
944
|
-
|
940
|
+
if @futures.empty?
|
941
|
+
resolve(@initial_value.equal?(NO_INITIAL_VALUE) ? nil : @initial_value)
|
942
|
+
else
|
943
|
+
accumulator = @initial_value
|
944
|
+
remaining = @futures.size
|
945
|
+
@futures.each do |f|
|
945
946
|
f.on_complete do |v, e|
|
946
947
|
unless failed?
|
947
948
|
if e
|
948
949
|
fail(e)
|
949
950
|
else
|
950
|
-
|
951
|
+
done = false
|
952
|
+
@lock.lock
|
953
|
+
begin
|
954
|
+
accumulator = accumulator.equal?(NO_INITIAL_VALUE) ? v : @reducer.call(accumulator, v)
|
955
|
+
remaining -= 1
|
956
|
+
done = (remaining == 0)
|
957
|
+
rescue => ee
|
958
|
+
@lock.unlock
|
959
|
+
fail(ee)
|
960
|
+
else
|
961
|
+
@lock.unlock
|
962
|
+
end
|
963
|
+
if done
|
964
|
+
@futures = nil
|
965
|
+
resolve(accumulator)
|
966
|
+
end
|
951
967
|
end
|
952
968
|
end
|
953
969
|
end
|
954
970
|
end
|
955
|
-
else
|
956
|
-
resolve(@initial_value)
|
957
971
|
end
|
958
972
|
end
|
959
973
|
end
|
data/lib/ione/io/io_reactor.rb
CHANGED
@@ -124,7 +124,7 @@ module Ione
|
|
124
124
|
# after {#stop} has been called, but false when the future returned by
|
125
125
|
# {#stop} completes.
|
126
126
|
def running?
|
127
|
-
@state == RUNNING_STATE
|
127
|
+
(state = @state) == RUNNING_STATE || state == STOPPING_STATE
|
128
128
|
end
|
129
129
|
|
130
130
|
# Starts the reactor. This will spawn a background thread that will manage
|
data/lib/ione/version.rb
CHANGED
@@ -354,6 +354,20 @@ module Ione
|
|
354
354
|
buffer.append(' baz baz')
|
355
355
|
buffer.index('baz', 8).should == 11
|
356
356
|
end
|
357
|
+
|
358
|
+
it 'returns the first index when the matching substring spans the read and write buffer' do
|
359
|
+
buffer.append('foo bar')
|
360
|
+
buffer.read(1)
|
361
|
+
buffer.append('bar barbar')
|
362
|
+
buffer.index('barbar', 0).should == 3
|
363
|
+
end
|
364
|
+
|
365
|
+
it 'returns nil when the substring does not fit in the search space' do
|
366
|
+
buffer.append('foo')
|
367
|
+
buffer.read(1)
|
368
|
+
buffer.append('bar')
|
369
|
+
buffer.index('bar', 3).should be_nil
|
370
|
+
end
|
357
371
|
end
|
358
372
|
|
359
373
|
context 'when reading and appending' do
|
data/spec/ione/future_spec.rb
CHANGED
@@ -916,6 +916,12 @@ module Ione
|
|
916
916
|
future.value.should == 6
|
917
917
|
end
|
918
918
|
|
919
|
+
it 'handles a really long list of futures' do
|
920
|
+
futures = Array.new(10000, Future.resolved(1))
|
921
|
+
future = Future.reduce(futures, 0, &:+)
|
922
|
+
future.value.should eq(10000)
|
923
|
+
end
|
924
|
+
|
919
925
|
context 'when the :ordered option is false' do
|
920
926
|
it 'calls the block with the values in the order of completion, when the :ordered option is false' do
|
921
927
|
promises = [Promise.new, Promise.new, Promise.new]
|
@@ -949,6 +955,12 @@ module Ione
|
|
949
955
|
future.should be_failed
|
950
956
|
end
|
951
957
|
|
958
|
+
it 'handles a really long list of futures' do
|
959
|
+
futures = Array.new(10000, Future.resolved(1))
|
960
|
+
future = Future.reduce(futures, 0, ordered: false, &:+)
|
961
|
+
future.value.should eq(10000)
|
962
|
+
end
|
963
|
+
|
952
964
|
context 'when the list of futures is empty' do
|
953
965
|
it 'returns a future that resolves to the initial value' do
|
954
966
|
Future.reduce([], :foo, ordered: false).value.should == :foo
|
@@ -93,6 +93,7 @@ module Ione
|
|
93
93
|
end
|
94
94
|
|
95
95
|
it 'restarts the reactor even when restarted before a failed stop' do
|
96
|
+
pending 'This test is broken in JRuby' if RUBY_ENGINE == 'jruby'
|
96
97
|
barrier = Queue.new
|
97
98
|
selector.handler do
|
98
99
|
if barrier.pop == :fail
|
@@ -171,12 +172,27 @@ module Ione
|
|
171
172
|
reactor.stop.value.should equal(reactor)
|
172
173
|
end
|
173
174
|
|
174
|
-
it 'is not running after
|
175
|
+
it 'is not running after stop completed' do
|
175
176
|
reactor.start.value
|
176
177
|
reactor.stop.value
|
177
178
|
reactor.should_not be_running
|
178
179
|
end
|
179
180
|
|
181
|
+
it 'keeps running until stop completed' do
|
182
|
+
running_barrier = Queue.new
|
183
|
+
stop_barrier = Queue.new
|
184
|
+
selector.handler do
|
185
|
+
running_barrier.push(nil)
|
186
|
+
stop_barrier.pop
|
187
|
+
[[], [], []]
|
188
|
+
end
|
189
|
+
reactor.start.value
|
190
|
+
future = reactor.stop
|
191
|
+
running_barrier.pop
|
192
|
+
reactor.should be_running
|
193
|
+
stop_barrier.push(nil) until future.completed?
|
194
|
+
end
|
195
|
+
|
180
196
|
it 'closes all sockets' do
|
181
197
|
reactor.start.value
|
182
198
|
connection = reactor.connect('example.com', 9999, 5).value
|
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.
|
4
|
+
version: 1.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Theo Hultberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-30 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
|