libuv 2.0.12 → 3.0.0

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/README.md +67 -34
  4. data/lib/libuv.rb +30 -5
  5. data/lib/libuv/async.rb +16 -10
  6. data/lib/libuv/check.rb +19 -12
  7. data/lib/libuv/coroutines.rb +39 -12
  8. data/lib/libuv/dns.rb +25 -18
  9. data/lib/libuv/error.rb +2 -0
  10. data/lib/libuv/ext/ext.rb +28 -36
  11. data/lib/libuv/ext/platform/darwin_x64.rb +2 -0
  12. data/lib/libuv/ext/platform/unix.rb +2 -0
  13. data/lib/libuv/ext/platform/windows.rb +2 -0
  14. data/lib/libuv/ext/tasks.rb +2 -0
  15. data/lib/libuv/ext/tasks/mac.rb +2 -0
  16. data/lib/libuv/ext/tasks/unix.rb +2 -0
  17. data/lib/libuv/ext/tasks/win.rb +2 -0
  18. data/lib/libuv/ext/types.rb +2 -1
  19. data/lib/libuv/file.rb +67 -50
  20. data/lib/libuv/filesystem.rb +63 -61
  21. data/lib/libuv/fs_event.rb +7 -4
  22. data/lib/libuv/handle.rb +30 -14
  23. data/lib/libuv/idle.rb +17 -10
  24. data/lib/libuv/mixins/accessors.rb +41 -0
  25. data/lib/libuv/mixins/assertions.rb +3 -1
  26. data/lib/libuv/mixins/fs_checks.rb +29 -6
  27. data/lib/libuv/mixins/listener.rb +4 -2
  28. data/lib/libuv/mixins/net.rb +4 -2
  29. data/lib/libuv/mixins/resource.rb +5 -3
  30. data/lib/libuv/mixins/stream.rb +128 -35
  31. data/lib/libuv/pipe.rb +54 -27
  32. data/lib/libuv/prepare.rb +19 -12
  33. data/lib/libuv/q.rb +109 -101
  34. data/lib/libuv/{loop.rb → reactor.rb} +163 -85
  35. data/lib/libuv/signal.rb +13 -5
  36. data/lib/libuv/tcp.rb +109 -63
  37. data/lib/libuv/timer.rb +44 -24
  38. data/lib/libuv/tty.rb +8 -3
  39. data/lib/libuv/udp.rb +49 -22
  40. data/lib/libuv/version.rb +3 -1
  41. data/lib/libuv/work.rb +14 -10
  42. data/libuv.gemspec +11 -9
  43. data/spec/async_spec.rb +13 -13
  44. data/spec/coroutines_spec.rb +20 -50
  45. data/spec/defer_spec.rb +182 -311
  46. data/spec/dns_spec.rb +51 -41
  47. data/spec/dsl_spec.rb +43 -0
  48. data/spec/filesystem_spec.rb +65 -87
  49. data/spec/idle_spec.rb +19 -33
  50. data/spec/pipe_spec.rb +25 -32
  51. data/spec/tcp_spec.rb +116 -53
  52. data/spec/timer_spec.rb +3 -3
  53. data/spec/udp_spec.rb +16 -17
  54. data/spec/zen_spec.rb +2 -3
  55. metadata +37 -30
data/spec/defer_spec.rb CHANGED
@@ -4,12 +4,12 @@ require 'libuv'
4
4
  describe Libuv::Q do
5
5
 
6
6
  before :each do
7
- @loop = Libuv::Loop.default
8
- @deferred = @loop.defer
7
+ @reactor = Libuv::Reactor.default
8
+ @deferred = @reactor.defer
9
9
  @promise = @deferred.promise
10
10
  @log = []
11
11
  @default_fail = proc { |reason|
12
- @loop.stop
12
+ @reactor.stop
13
13
  }
14
14
  end
15
15
 
@@ -18,16 +18,12 @@ describe Libuv::Q do
18
18
 
19
19
 
20
20
  it "should call the callback in the next turn" do
21
- @loop.run {
21
+ @reactor.run {
22
22
  @promise.then nil, @default_fail do |result|
23
23
  @log << result
24
24
  end
25
25
 
26
26
  @deferred.resolve(:foo)
27
-
28
- @loop.next_tick do
29
- @loop.stop
30
- end
31
27
  }
32
28
 
33
29
  expect(@log).to eq([:foo])
@@ -36,7 +32,7 @@ describe Libuv::Q do
36
32
 
37
33
 
38
34
  it "should be able to resolve the callback after it has already been resolved" do
39
- @loop.run {
35
+ @reactor.run {
40
36
  @promise.then nil, @default_fail do |result|
41
37
  @log << result
42
38
  @promise.then nil, @default_fail do |result|
@@ -45,12 +41,6 @@ describe Libuv::Q do
45
41
  end
46
42
 
47
43
  @deferred.resolve(:foo)
48
-
49
- @loop.next_tick do
50
- @loop.next_tick do
51
- @loop.stop
52
- end
53
- end
54
44
  }
55
45
  expect(@log).to eq([:foo, :foo])
56
46
  end
@@ -58,7 +48,7 @@ describe Libuv::Q do
58
48
 
59
49
 
60
50
  it "should fulfill success callbacks in the registration order" do
61
- @loop.run {
51
+ @reactor.run {
62
52
  @promise.then nil, @default_fail do |result|
63
53
  @log << :first
64
54
  end
@@ -68,17 +58,13 @@ describe Libuv::Q do
68
58
  end
69
59
 
70
60
  @deferred.resolve(:foo)
71
-
72
- @loop.next_tick do
73
- @loop.stop
74
- end
75
61
  }
76
62
  expect(@log).to eq([:first, :second])
77
63
  end
78
64
 
79
65
 
80
66
  it "should do nothing if a promise was previously resolved" do
81
- @loop.run {
67
+ @reactor.run {
82
68
  @promise.then nil, @default_fail do |result|
83
69
  @log << result
84
70
  expect(@log).to eq([:foo])
@@ -87,30 +73,17 @@ describe Libuv::Q do
87
73
 
88
74
  @deferred.resolve(:foo)
89
75
  @deferred.reject(:baz)
90
-
91
- #
92
- # 4 ticks should detect any errors
93
- #
94
- @loop.next_tick do
95
- @loop.next_tick do
96
- @loop.next_tick do
97
- @loop.next_tick do
98
- @loop.stop
99
- end
100
- end
101
- end
102
- end
103
76
  }
104
77
  expect(@log).to eq([:foo])
105
78
  end
106
79
 
107
80
 
108
81
  it "should allow deferred resolution with a new promise" do
109
- deferred2 = @loop.defer
110
- @loop.run {
82
+ deferred2 = @reactor.defer
83
+ @reactor.run {
111
84
  @promise.then nil, @default_fail do |result|
112
85
  @log << result
113
- @loop.stop
86
+ @reactor.stop
114
87
  end
115
88
 
116
89
  @deferred.resolve(deferred2.promise)
@@ -121,7 +94,7 @@ describe Libuv::Q do
121
94
 
122
95
 
123
96
  it "should not break if a callbacks registers another callback" do
124
- @loop.run {
97
+ @reactor.run {
125
98
  @promise.then nil, @default_fail do |result|
126
99
  @log << :outer
127
100
  @promise.then nil, @default_fail do |result|
@@ -130,12 +103,6 @@ describe Libuv::Q do
130
103
  end
131
104
 
132
105
  @deferred.resolve(:foo)
133
-
134
- @loop.next_tick do
135
- @loop.next_tick do
136
- @loop.stop
137
- end
138
- end
139
106
  }
140
107
 
141
108
  expect(@log).to eq([:outer, :inner])
@@ -144,9 +111,9 @@ describe Libuv::Q do
144
111
 
145
112
 
146
113
  it "can modify the result of a promise before returning" do
147
- @loop.run {
114
+ @reactor.run {
148
115
  proc { |name|
149
- @loop.work { @deferred.resolve("Hello #{name}") }
116
+ @reactor.work { @deferred.resolve("Hello #{name}") }
150
117
  @promise.then nil, @default_fail do |result|
151
118
  @log << result
152
119
  result += "?"
@@ -154,7 +121,7 @@ describe Libuv::Q do
154
121
  end
155
122
  }.call('Robin Hood').then nil, @default_fail do |greeting|
156
123
  @log << greeting
157
- @loop.stop
124
+ @reactor.stop
158
125
  end
159
126
  }
160
127
 
@@ -167,7 +134,7 @@ describe Libuv::Q do
167
134
  describe 'reject' do
168
135
 
169
136
  it "should reject the promise and execute all error callbacks" do
170
- @loop.run {
137
+ @reactor.run {
171
138
  @promise.then(@default_fail, proc {|result|
172
139
  @log << :first
173
140
  })
@@ -176,17 +143,13 @@ describe Libuv::Q do
176
143
  })
177
144
 
178
145
  @deferred.reject(:foo)
179
-
180
- @loop.next_tick do
181
- @loop.stop
182
- end
183
146
  }
184
147
  expect(@log).to eq([:first, :second])
185
148
  end
186
149
 
187
150
 
188
151
  it "should do nothing if a promise was previously rejected" do
189
- @loop.run {
152
+ @reactor.run {
190
153
  @promise.then(@default_fail, proc {|result|
191
154
  @log << result
192
155
  @deferred.resolve(:bar)
@@ -194,33 +157,20 @@ describe Libuv::Q do
194
157
 
195
158
  @deferred.reject(:baz)
196
159
  @deferred.resolve(:foo)
197
-
198
- #
199
- # 4 ticks should detect any errors
200
- #
201
- @loop.next_tick do
202
- @loop.next_tick do
203
- @loop.next_tick do
204
- @loop.next_tick do
205
- @loop.stop
206
- end
207
- end
208
- end
209
- end
210
160
  }
211
161
  expect(@log).to eq([:baz])
212
162
  end
213
163
 
214
164
 
215
165
  it "should not defer rejection with a new promise" do
216
- deferred2 = @loop.defer
217
- @loop.run {
166
+ deferred2 = @reactor.defer
167
+ @reactor.run {
218
168
  @promise.then(@default_fail, @default_fail)
219
169
  begin
220
170
  @deferred.reject(deferred2.promise)
221
171
  rescue => e
222
172
  @log << e.is_a?(ArgumentError)
223
- @loop.stop
173
+ @reactor.stop
224
174
  end
225
175
  }
226
176
 
@@ -232,7 +182,7 @@ describe Libuv::Q do
232
182
 
233
183
  describe 'notify' do
234
184
  it "should execute all progress callbacks in the registration order" do
235
- @loop.run {
185
+ @reactor.run {
236
186
  @promise.progress do |update|
237
187
  @log << :first
238
188
  end
@@ -242,17 +192,13 @@ describe Libuv::Q do
242
192
  end
243
193
 
244
194
  @deferred.notify(:foo)
245
-
246
- @loop.next_tick do
247
- @loop.stop
248
- end
249
195
  }
250
196
 
251
197
  expect(@log).to eq([:first, :second])
252
198
  end
253
199
 
254
200
  it "should do nothing if a promise was previously resolved" do
255
- @loop.run {
201
+ @reactor.run {
256
202
 
257
203
  @promise.progress do |update|
258
204
  @log << update
@@ -260,48 +206,19 @@ describe Libuv::Q do
260
206
 
261
207
  @deferred.resolve(:foo)
262
208
  @deferred.notify(:baz)
263
-
264
-
265
- #
266
- # 4 ticks should detect any errors
267
- #
268
- @loop.next_tick do
269
- @loop.next_tick do
270
- @loop.next_tick do
271
- @loop.next_tick do
272
- @loop.stop
273
- end
274
- end
275
- end
276
- end
277
209
  }
278
210
 
279
211
  expect(@log).to eq([])
280
212
  end
281
213
 
282
214
  it "should do nothing if a promise was previously rejected" do
283
- @loop.run {
215
+ @reactor.run {
284
216
 
285
217
  @promise.progress do |update|
286
218
  @log << update
287
219
  end
288
220
  @deferred.reject(:foo)
289
221
  @deferred.notify(:baz)
290
-
291
-
292
-
293
- #
294
- # 4 ticks should detect any errors
295
- #
296
- @loop.next_tick do
297
- @loop.next_tick do
298
- @loop.next_tick do
299
- @loop.next_tick do
300
- @loop.stop
301
- end
302
- end
303
- end
304
- end
305
222
  }
306
223
 
307
224
  expect(@log).to eq([])
@@ -309,17 +226,13 @@ describe Libuv::Q do
309
226
 
310
227
 
311
228
  it "should not apply any special treatment to promises passed to notify" do
312
- @loop.run {
313
- deferred2 = @loop.defer
229
+ @reactor.run {
230
+ deferred2 = @reactor.defer
314
231
 
315
232
  @promise.progress do |update|
316
233
  @log << update.is_a?(::Libuv::Q::Promise)
317
234
  end
318
235
  @deferred.notify(deferred2.promise)
319
-
320
- @loop.next_tick do
321
- @loop.stop
322
- end
323
236
  }
324
237
 
325
238
  expect(@log).to eq([true])
@@ -327,7 +240,7 @@ describe Libuv::Q do
327
240
 
328
241
 
329
242
  it "should call the progress callbacks in the next turn" do
330
- @loop.run {
243
+ @reactor.run {
331
244
  @promise.progress do |update|
332
245
  @log << :first
333
246
  end
@@ -339,14 +252,13 @@ describe Libuv::Q do
339
252
  @deferred.notify(:foo)
340
253
 
341
254
  @log << @log.length # Has notify run in this tick
342
- @loop.stop # Stop will run through the next tick before stopping
343
255
  }
344
256
 
345
257
  expect(@log).to eq([0, :first, :second])
346
258
  end
347
259
 
348
260
  it "should ignore notifications sent out in the same turn before listener registration" do
349
- @loop.run {
261
+ @reactor.run {
350
262
  @deferred.notify(:foo)
351
263
 
352
264
  @promise.progress do |update|
@@ -356,10 +268,6 @@ describe Libuv::Q do
356
268
  @promise.progress do |update|
357
269
  @log << :second
358
270
  end
359
-
360
- @loop.next_tick do
361
- @loop.stop
362
- end
363
271
  }
364
272
 
365
273
  expect(@log).to eq([])
@@ -368,20 +276,16 @@ describe Libuv::Q do
368
276
 
369
277
 
370
278
  describe Libuv::Q::Promise do
371
-
279
+
372
280
  describe 'then' do
373
281
 
374
282
  it "should allow registration of a success callback without an errback and resolve" do
375
- @loop.run {
283
+ @reactor.run {
376
284
  @promise.then do |result|
377
285
  @log << result
378
286
  end
379
287
 
380
288
  @deferred.resolve(:foo)
381
-
382
- @loop.next_tick do
383
- @loop.stop
384
- end
385
289
  }
386
290
 
387
291
  expect(@log).to eq([:foo])
@@ -389,16 +293,12 @@ describe Libuv::Q do
389
293
 
390
294
 
391
295
  it "should allow registration of a success callback without an errback and reject" do
392
- @loop.run {
296
+ @reactor.run {
393
297
  @promise.then do |result|
394
298
  @log << result
395
299
  end
396
300
 
397
301
  @deferred.reject(:foo)
398
-
399
- @loop.next_tick do
400
- @loop.stop
401
- end
402
302
  }
403
303
 
404
304
  expect(@log).to eq([])
@@ -406,16 +306,12 @@ describe Libuv::Q do
406
306
 
407
307
 
408
308
  it "should allow registration of an errback without a success callback and reject" do
409
- @loop.run {
309
+ @reactor.run {
410
310
  @promise.catch(proc {|reason|
411
311
  @log << reason
412
312
  })
413
313
 
414
314
  @deferred.reject(:foo)
415
-
416
- @loop.next_tick do
417
- @loop.stop
418
- end
419
315
  }
420
316
 
421
317
  expect(@log).to eq([:foo])
@@ -423,16 +319,12 @@ describe Libuv::Q do
423
319
 
424
320
 
425
321
  it "should allow registration of an errback without a success callback and resolve" do
426
- @loop.run {
322
+ @reactor.run {
427
323
  @promise.catch(proc {|reason|
428
324
  @log << reason
429
325
  })
430
326
 
431
327
  @deferred.resolve(:foo)
432
-
433
- @loop.next_tick do
434
- @loop.stop
435
- end
436
328
  }
437
329
 
438
330
  expect(@log).to eq([])
@@ -440,7 +332,7 @@ describe Libuv::Q do
440
332
 
441
333
 
442
334
  it "should resolve all callbacks with the original value" do
443
- @loop.run {
335
+ @reactor.run {
444
336
  @promise.then nil, @default_fail do |result|
445
337
  @log << result
446
338
  :alt1
@@ -451,7 +343,7 @@ describe Libuv::Q do
451
343
  end
452
344
  @promise.then nil, @default_fail do |result|
453
345
  @log << result
454
- Libuv::Q.reject(@loop, 'some reason')
346
+ Libuv::Q.reject(@reactor, 'some reason')
455
347
  end
456
348
  @promise.then nil, @default_fail do |result|
457
349
  @log << result
@@ -459,10 +351,6 @@ describe Libuv::Q do
459
351
  end
460
352
 
461
353
  @deferred.resolve(:foo)
462
-
463
- @loop.next_tick do
464
- @loop.stop
465
- end
466
354
  }
467
355
 
468
356
  expect(@log).to eq([:foo, :foo, :foo, :foo])
@@ -470,7 +358,7 @@ describe Libuv::Q do
470
358
 
471
359
 
472
360
  it "should notify all callbacks with the original value" do
473
- @loop.run { |loop_promise|
361
+ @reactor.run { |reactor_promise|
474
362
  @promise.progress do |result|
475
363
  @log << result
476
364
  :alt1
@@ -481,7 +369,7 @@ describe Libuv::Q do
481
369
  end
482
370
  @promise.progress do |result|
483
371
  @log << result
484
- Libuv::Q.reject(@loop, 'some reason')
372
+ Libuv::Q.reject(@reactor, 'some reason')
485
373
  end
486
374
  @promise.progress do |result|
487
375
  @log << result
@@ -490,18 +378,6 @@ describe Libuv::Q do
490
378
 
491
379
 
492
380
  @deferred.notify(:foo)
493
-
494
- @loop.next_tick do
495
- @loop.next_tick do
496
- @loop.next_tick do
497
- @loop.next_tick do
498
- @loop.next_tick do
499
- @loop.stop
500
- end
501
- end
502
- end
503
- end
504
- end
505
381
  }
506
382
 
507
383
  expect(@log).to eq([:foo, :foo, :foo, :foo])
@@ -509,7 +385,7 @@ describe Libuv::Q do
509
385
 
510
386
 
511
387
  it "should reject all callbacks with the original reason" do
512
- @loop.run {
388
+ @reactor.run {
513
389
  @promise.then(@default_fail, proc {|result|
514
390
  @log << result
515
391
  :alt1
@@ -520,7 +396,7 @@ describe Libuv::Q do
520
396
  })
521
397
  @promise.then(@default_fail, proc {|result|
522
398
  @log << result
523
- Libuv::Q.reject(@loop, 'some reason')
399
+ Libuv::Q.reject(@reactor, 'some reason')
524
400
  })
525
401
  @promise.then(@default_fail, proc {|result|
526
402
  @log << result
@@ -528,10 +404,6 @@ describe Libuv::Q do
528
404
  })
529
405
 
530
406
  @deferred.reject(:foo)
531
-
532
- @loop.next_tick do
533
- @loop.stop
534
- end
535
407
  }
536
408
 
537
409
  expect(@log).to eq([:foo, :foo, :foo, :foo])
@@ -539,7 +411,7 @@ describe Libuv::Q do
539
411
 
540
412
 
541
413
  it "should propagate resolution and rejection between dependent promises" do
542
- @loop.run {
414
+ @reactor.run {
543
415
  @promise.then(proc { |result|
544
416
  @log << result
545
417
  :bar
@@ -557,20 +429,6 @@ describe Libuv::Q do
557
429
  }, @default_fail)
558
430
 
559
431
  @deferred.resolve(:foo)
560
-
561
- @loop.next_tick do
562
- @loop.next_tick do
563
- @loop.next_tick do
564
- @loop.next_tick do
565
- @loop.next_tick do
566
- @loop.next_tick do # extra tick?
567
- @loop.stop
568
- end
569
- end
570
- end
571
- end
572
- end
573
- end
574
432
  }
575
433
 
576
434
  expect(@log).to eq([:foo, :bar, 'baz', 'bob', :done])
@@ -578,8 +436,8 @@ describe Libuv::Q do
578
436
 
579
437
 
580
438
  it "should propagate notification between dependent promises" do
581
- @loop.run { |loop_promise|
582
- loop_promise.progress do |type, id, error|
439
+ @reactor.run { |reactor|
440
+ reactor.notifier do |type, id, error|
583
441
  @log << id
584
442
  end
585
443
 
@@ -603,20 +461,6 @@ describe Libuv::Q do
603
461
 
604
462
 
605
463
  @deferred.notify(:foo)
606
-
607
- @loop.next_tick do
608
- @loop.next_tick do
609
- @loop.next_tick do
610
- @loop.next_tick do
611
- @loop.next_tick do
612
- @loop.next_tick do # extra tick?
613
- @loop.stop
614
- end
615
- end
616
- end
617
- end
618
- end
619
- end
620
464
  }
621
465
 
622
466
  expect(@log).to eq([:foo, :bar, :bar, :bar, :done])
@@ -624,9 +468,9 @@ describe Libuv::Q do
624
468
 
625
469
 
626
470
  it "should stop notification propagation in case of error" do
627
- @loop.run { |loop_logger|
628
- loop_logger.progress do |type, id, error|
629
- @log << id
471
+ @reactor.run { |reactor|
472
+ reactor.notifier do |error, context|
473
+ @log << context
630
474
  end
631
475
 
632
476
 
@@ -650,34 +494,22 @@ describe Libuv::Q do
650
494
 
651
495
 
652
496
  @deferred.notify(:foo)
653
-
654
- @loop.next_tick do
655
- @loop.next_tick do
656
- @loop.next_tick do
657
- @loop.next_tick do
658
- @loop.next_tick do
659
- @loop.stop
660
- end
661
- end
662
- end
663
- end
664
- end
665
497
  }
666
498
 
667
- expect(@log).to eq([:foo, :bar, :q_progress_cb])
499
+ expect(@log).to eq([:foo, :bar, "performing promise progress callback"])
668
500
  end
669
501
 
670
502
 
671
503
  it "should call error callback in the next turn even if promise is already rejected" do
672
- @loop.run {
504
+ @reactor.run {
673
505
  @deferred.reject(:foo)
674
506
 
675
507
  @promise.catch(proc {|reason|
676
508
  @log << reason
677
509
  })
678
510
 
679
- @loop.next_tick do
680
- @loop.stop
511
+ @reactor.next_tick do
512
+ @reactor.stop
681
513
  end
682
514
  }
683
515
 
@@ -693,23 +525,19 @@ describe Libuv::Q do
693
525
  describe 'when the promise is fulfilled' do
694
526
 
695
527
  it "should call the callback" do
696
- @loop.run {
528
+ @reactor.run {
697
529
  @promise.finally do
698
530
  @log << :finally
699
531
  end
700
532
 
701
533
  @deferred.resolve(:foo)
702
-
703
- @loop.next_tick do
704
- @loop.stop
705
- end
706
534
  }
707
535
 
708
536
  expect(@log).to eq([:finally])
709
537
  end
710
538
 
711
539
  it "should fulfill with the original value" do
712
- @loop.run {
540
+ @reactor.run {
713
541
  @promise.finally(proc {
714
542
  @log << :finally
715
543
  :finally
@@ -719,19 +547,13 @@ describe Libuv::Q do
719
547
 
720
548
 
721
549
  @deferred.resolve(:foo)
722
-
723
- @loop.next_tick do
724
- @loop.next_tick do
725
- @loop.stop
726
- end
727
- end
728
550
  }
729
551
 
730
552
  expect(@log).to eq([:finally, :foo])
731
553
  end
732
554
 
733
555
  it "should fulfill with the original value (larger test)" do
734
- @loop.run {
556
+ @reactor.run {
735
557
  @promise.then(proc { |result|
736
558
  @log << result
737
559
  result
@@ -754,25 +576,6 @@ describe Libuv::Q do
754
576
 
755
577
 
756
578
  @deferred.resolve(:foo)
757
-
758
-
759
- @loop.next_tick do
760
- @loop.next_tick do
761
- @loop.next_tick do
762
- @loop.next_tick do
763
- @loop.next_tick do
764
- @loop.next_tick do
765
- @loop.next_tick do
766
- @loop.next_tick do
767
- @loop.stop
768
- end
769
- end
770
- end
771
- end
772
- end
773
- end
774
- end
775
- end
776
579
  }
777
580
 
778
581
  expect(@log).to eq([:foo, :finally, :foo, :change, :finally, :change])
@@ -780,7 +583,7 @@ describe Libuv::Q do
780
583
 
781
584
  describe "when the callback throws an exception" do
782
585
  it "should reject with this new exception" do
783
- @loop.run {
586
+ @reactor.run {
784
587
  @promise.finally(proc {
785
588
  @log << :finally
786
589
  raise 'error'
@@ -789,12 +592,6 @@ describe Libuv::Q do
789
592
  end
790
593
 
791
594
  @deferred.resolve(:foo)
792
-
793
- @loop.next_tick do
794
- @loop.next_tick do
795
- @loop.stop
796
- end
797
- end
798
595
  }
799
596
 
800
597
  expect(@log).to eq([:finally, true])
@@ -803,8 +600,8 @@ describe Libuv::Q do
803
600
 
804
601
  describe "when the callback returns a promise" do
805
602
  it "should fulfill with the original reason after that promise resolves" do
806
- @loop.run {
807
- deferred2 = @loop.defer
603
+ @reactor.run {
604
+ deferred2 = @reactor.defer
808
605
 
809
606
  @promise.finally(proc {
810
607
  @log << :finally
@@ -815,17 +612,12 @@ describe Libuv::Q do
815
612
 
816
613
  @deferred.resolve(:foo)
817
614
 
818
- @loop.next_tick do
819
- @loop.next_tick do
820
- @loop.next_tick do
821
- @loop.next_tick do
615
+ @reactor.next_tick do
616
+ @reactor.next_tick do
617
+ @reactor.next_tick do
618
+ @reactor.next_tick do
822
619
  @log << :resolving
823
620
  deferred2.resolve('working')
824
- @loop.next_tick do
825
- @loop.next_tick do
826
- @loop.stop
827
- end
828
- end
829
621
  end
830
622
  end
831
623
  end
@@ -837,8 +629,8 @@ describe Libuv::Q do
837
629
 
838
630
 
839
631
  it "should reject with the new reason when it is rejected" do
840
- @loop.run {
841
- deferred2 = @loop.defer
632
+ @reactor.run {
633
+ deferred2 = @reactor.defer
842
634
 
843
635
  @promise.finally(proc {
844
636
  @log << :finally
@@ -849,17 +641,12 @@ describe Libuv::Q do
849
641
 
850
642
  @deferred.resolve(:foo)
851
643
 
852
- @loop.next_tick do
853
- @loop.next_tick do
854
- @loop.next_tick do
855
- @loop.next_tick do
644
+ @reactor.next_tick do
645
+ @reactor.next_tick do
646
+ @reactor.next_tick do
647
+ @reactor.next_tick do
856
648
  @log << :rejecting
857
649
  deferred2.reject(:rejected)
858
- @loop.next_tick do
859
- @loop.next_tick do
860
- @loop.stop
861
- end
862
- end
863
650
  end
864
651
  end
865
652
  end
@@ -873,6 +660,104 @@ describe Libuv::Q do
873
660
  end
874
661
 
875
662
  end
663
+
664
+
665
+ describe 'value' do
666
+ it "should resolve a promise value as a future" do
667
+ @reactor.run {
668
+ @reactor.next_tick do
669
+ @deferred.resolve(:foo)
670
+ end
671
+ @log << @deferred.promise.value
672
+ }
673
+
674
+ expect(@log).to eq([:foo])
675
+ end
676
+
677
+ it "should reject a promise value as a future" do
678
+ @reactor.run {
679
+ @reactor.next_tick do
680
+ @deferred.reject(:foo)
681
+ end
682
+
683
+ begin
684
+ @deferred.promise.value
685
+ @log << 'should raise exception'
686
+ rescue => e
687
+ expect(e.class).to eq(CoroutineRejection)
688
+ @log << e.value
689
+ end
690
+ }
691
+
692
+ expect(@log).to eq([:foo])
693
+ end
694
+
695
+ it "should resolve a deferred value as a future" do
696
+ @reactor.run {
697
+ @reactor.next_tick do
698
+ @deferred.resolve(:foo)
699
+ end
700
+ @log << @deferred.value
701
+ }
702
+
703
+ expect(@log).to eq([:foo])
704
+ end
705
+
706
+ it "should reject a deferred value as a future" do
707
+ @reactor.run {
708
+ @reactor.next_tick do
709
+ @deferred.reject(:foo)
710
+ end
711
+
712
+ begin
713
+ @deferred.value
714
+ @log << 'should raise exception'
715
+ rescue => e
716
+ expect(e.class).to eq(CoroutineRejection)
717
+ @log << e.value
718
+ end
719
+ }
720
+
721
+ expect(@log).to eq([:foo])
722
+ end
723
+
724
+ it "should reject with message when rejection was a string" do
725
+ @reactor.run {
726
+ @reactor.next_tick do
727
+ @deferred.reject('foo')
728
+ end
729
+
730
+ begin
731
+ @deferred.value
732
+ @log << 'should raise exception'
733
+ rescue => e
734
+ expect(e.class).to eq(CoroutineRejection)
735
+ @log << e.message
736
+ @log << e.value
737
+ end
738
+ }
739
+
740
+ expect(@log).to eq(['foo', 'foo'])
741
+ end
742
+
743
+ it "should pass through exceptions without modification" do
744
+ @reactor.run {
745
+ @reactor.next_tick do
746
+ @deferred.reject(RuntimeError.new('fail'))
747
+ end
748
+
749
+ begin
750
+ @deferred.value
751
+ @log << 'should raise exception'
752
+ rescue => e
753
+ expect(e.class).to eq(RuntimeError)
754
+ @log << e.message
755
+ end
756
+ }
757
+
758
+ expect(@log).to eq(['fail'])
759
+ end
760
+ end
876
761
 
877
762
  end
878
763
 
@@ -881,18 +766,14 @@ describe Libuv::Q do
881
766
  describe 'reject' do
882
767
 
883
768
  it "should package a string into a rejected promise" do
884
- @loop.run {
885
- rejectedPromise = Libuv::Q.reject(@loop, 'not gonna happen')
769
+ @reactor.run {
770
+ rejectedPromise = Libuv::Q.reject(@reactor, 'not gonna happen')
886
771
 
887
772
  @promise.then(@default_fail, proc {|reason|
888
773
  @log << reason
889
774
  })
890
775
 
891
776
  @deferred.resolve(rejectedPromise)
892
-
893
- @loop.next_tick do
894
- @loop.stop
895
- end
896
777
  }
897
778
 
898
779
  expect(@log).to eq(['not gonna happen'])
@@ -900,20 +781,14 @@ describe Libuv::Q do
900
781
 
901
782
 
902
783
  it "should return a promise that forwards callbacks if the callbacks are missing" do
903
- @loop.run {
904
- rejectedPromise = Libuv::Q.reject(@loop, 'not gonna happen')
784
+ @reactor.run {
785
+ rejectedPromise = Libuv::Q.reject(@reactor, 'not gonna happen')
905
786
 
906
787
  @promise.then(@default_fail, proc {|reason|
907
788
  @log << reason
908
789
  })
909
790
 
910
791
  @deferred.resolve(rejectedPromise.then())
911
-
912
- @loop.next_tick do
913
- @loop.next_tick do
914
- @loop.stop
915
- end
916
- end
917
792
  }
918
793
 
919
794
  expect(@log).to eq(['not gonna happen'])
@@ -926,32 +801,28 @@ describe Libuv::Q do
926
801
  describe 'all' do
927
802
 
928
803
  it "should resolve all of nothing" do
929
- @loop.run {
930
- Libuv::Q.all(@loop).then nil, @default_fail do |result|
804
+ @reactor.run {
805
+ Libuv::Q.all(@reactor).then nil, @default_fail do |result|
931
806
  @log << result
932
807
  end
933
-
934
- @loop.next_tick do
935
- @loop.stop
936
- end
937
808
  }
938
809
 
939
810
  expect(@log).to eq([[]])
940
811
  end
941
812
 
942
813
  it "should take an array of promises and return a promise for an array of results" do
943
- @loop.run {
944
- deferred1 = @loop.defer
945
- deferred2 = @loop.defer
814
+ @reactor.run {
815
+ deferred1 = @reactor.defer
816
+ deferred2 = @reactor.defer
946
817
 
947
- Libuv::Q.all(@loop, @promise, deferred1.promise, deferred2.promise).then nil, @default_fail do |result|
818
+ Libuv::Q.all(@reactor, @promise, deferred1.promise, deferred2.promise).then nil, @default_fail do |result|
948
819
  @log = result
949
- @loop.stop
820
+ @reactor.stop
950
821
  end
951
822
 
952
- @loop.work { @deferred.resolve(:foo) }
953
- @loop.work { deferred2.resolve(:baz) }
954
- @loop.work { deferred1.resolve(:bar) }
823
+ @reactor.work { @deferred.resolve(:foo) }
824
+ @reactor.work { deferred2.resolve(:baz) }
825
+ @reactor.work { deferred1.resolve(:bar) }
955
826
  }
956
827
 
957
828
  expect(@log).to eq([:foo, :bar, :baz])
@@ -959,17 +830,17 @@ describe Libuv::Q do
959
830
 
960
831
 
961
832
  it "should reject the derived promise if at least one of the promises in the array is rejected" do
962
- @loop.run {
963
- deferred1 = @loop.defer
964
- deferred2 = @loop.defer
833
+ @reactor.run {
834
+ deferred1 = @reactor.defer
835
+ deferred2 = @reactor.defer
965
836
 
966
- Libuv::Q.all(@loop, @promise, deferred1.promise, deferred2.promise).then(@default_fail, proc {|reason|
837
+ Libuv::Q.all(@reactor, @promise, deferred1.promise, deferred2.promise).then(@default_fail, proc {|reason|
967
838
  @log << reason
968
- @loop.stop
839
+ @reactor.stop
969
840
  })
970
841
 
971
- @loop.work { @deferred.resolve(:foo) }
972
- @loop.work { deferred2.reject(:baz) }
842
+ @reactor.work { @deferred.resolve(:foo) }
843
+ @reactor.work { deferred2.reject(:baz) }
973
844
  }
974
845
 
975
846
  expect(@log).to eq([:baz])