rack-async 0.0.1 → 0.1.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.
- data/lib/rack/async.rb +68 -37
- metadata +21 -41
data/lib/rack/async.rb
CHANGED
@@ -49,33 +49,94 @@ module Rack
|
|
49
49
|
alias wait pop
|
50
50
|
end
|
51
51
|
|
52
|
+
module Deferrable
|
53
|
+
def set_deferred_status(status, *args)
|
54
|
+
@deferred_status = status
|
55
|
+
@deferred_args = args
|
56
|
+
iterator = Proc.new {|block| block.call(*@deferred_args)}
|
57
|
+
case status
|
58
|
+
when :succeeded
|
59
|
+
@callbacks.each(&iterator)
|
60
|
+
when :failed
|
61
|
+
@errbacks.each(&iterator)
|
62
|
+
end
|
63
|
+
@callbacks.clear
|
64
|
+
@errbacks.clear
|
65
|
+
end
|
66
|
+
|
67
|
+
def succeed(*args)
|
68
|
+
set_deferred_status(:succeeded)
|
69
|
+
end
|
70
|
+
alias finish succeed
|
71
|
+
alias set_deferred_success succeed
|
72
|
+
|
73
|
+
def fail(*args)
|
74
|
+
set_deferred_status(:failed)
|
75
|
+
end
|
76
|
+
alias set_deferred_failure fail
|
77
|
+
|
78
|
+
def callback(&block)
|
79
|
+
if @deferred_status == :succeeded
|
80
|
+
block.call(*@deferred_args)
|
81
|
+
elsif @deferred_status != :failed
|
82
|
+
@callbacks.unshift(block)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def errback(&block)
|
87
|
+
if @deferred_status == :failed
|
88
|
+
block.call(*@deferred_args)
|
89
|
+
elsif @deferred_status != :succeeded
|
90
|
+
@errbacks.unshift(block)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
52
95
|
class BlockingBody < Queue
|
96
|
+
include Deferrable
|
97
|
+
|
98
|
+
def initialize(*args)
|
99
|
+
super
|
100
|
+
@callbacks = []
|
101
|
+
@errbacks = []
|
102
|
+
end
|
103
|
+
|
53
104
|
def each
|
54
|
-
until @
|
105
|
+
until @deferred_status && empty?
|
55
106
|
data = pop
|
56
107
|
yield data if data
|
57
108
|
end
|
109
|
+
rescue
|
110
|
+
fail
|
111
|
+
raise
|
58
112
|
end
|
59
113
|
|
60
|
-
def
|
61
|
-
|
114
|
+
def set_deferred_status(*args)
|
115
|
+
super
|
62
116
|
self << nil
|
63
117
|
end
|
64
|
-
alias finish succeed
|
65
|
-
alias fail succeed
|
66
118
|
end
|
67
119
|
|
68
120
|
class CallbackBody
|
121
|
+
include Deferrable
|
122
|
+
|
69
123
|
def initialize(*args)
|
70
124
|
super
|
71
125
|
@buffer = []
|
72
126
|
@lock = Mutex.new
|
127
|
+
@callbacks = []
|
128
|
+
@errbacks = []
|
73
129
|
end
|
74
130
|
|
75
131
|
def <<(data)
|
76
132
|
@lock.synchronize do
|
77
133
|
if @each_callback
|
78
|
-
|
134
|
+
begin
|
135
|
+
@each_callback.call(data)
|
136
|
+
rescue
|
137
|
+
fail
|
138
|
+
raise
|
139
|
+
end
|
79
140
|
else
|
80
141
|
@buffer << data
|
81
142
|
end
|
@@ -91,37 +152,7 @@ module Rack
|
|
91
152
|
end
|
92
153
|
end
|
93
154
|
|
94
|
-
|
95
|
-
@callback.call if @callback
|
96
|
-
@finished = true
|
97
|
-
end
|
98
|
-
alias finish succeed
|
99
|
-
|
100
|
-
def fail
|
101
|
-
@errback.call if @errback
|
102
|
-
@finished = true
|
103
|
-
end
|
104
|
-
|
105
|
-
def callback(&block)
|
106
|
-
if !@callback && @finished
|
107
|
-
block.call
|
108
|
-
else
|
109
|
-
@callback = block
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def errback(&block)
|
114
|
-
if !@errback && @finished
|
115
|
-
block.call
|
116
|
-
else
|
117
|
-
@errback = block
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def on_eof(&block)
|
122
|
-
callback(&block)
|
123
|
-
errback(&block)
|
124
|
-
end
|
155
|
+
alias on_eof callback # :nodoc: ebb compatibility
|
125
156
|
end
|
126
157
|
|
127
158
|
end
|
metadata
CHANGED
@@ -1,71 +1,51 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-async
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 0.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Matthew Sadler
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2011-01-19 00:00:00 +00:00
|
19
|
-
default_executable:
|
12
|
+
date: 2011-10-09 00:00:00.000000000Z
|
20
13
|
dependencies: []
|
21
|
-
|
22
14
|
description: Thin's asynchronous API available to any Rack server.
|
23
15
|
email: mat@sourcetagsandcodes.com
|
24
16
|
executables: []
|
25
|
-
|
26
17
|
extensions: []
|
27
|
-
|
28
|
-
extra_rdoc_files:
|
18
|
+
extra_rdoc_files:
|
29
19
|
- README.rdoc
|
30
|
-
files:
|
20
|
+
files:
|
31
21
|
- lib/rack/async.rb
|
32
22
|
- README.rdoc
|
33
|
-
has_rdoc: true
|
34
23
|
homepage: http://github.com/matsadler/rack-async
|
35
24
|
licenses: []
|
36
|
-
|
37
25
|
post_install_message:
|
38
|
-
rdoc_options:
|
26
|
+
rdoc_options:
|
39
27
|
- --main
|
40
28
|
- README.rdoc
|
41
29
|
- --charset
|
42
30
|
- utf-8
|
43
|
-
require_paths:
|
31
|
+
require_paths:
|
44
32
|
- lib
|
45
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
34
|
none: false
|
47
|
-
requirements:
|
48
|
-
- -
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
|
51
|
-
|
52
|
-
- 0
|
53
|
-
version: "0"
|
54
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
40
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
version: "0"
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
63
45
|
requirements: []
|
64
|
-
|
65
46
|
rubyforge_project:
|
66
|
-
rubygems_version: 1.
|
47
|
+
rubygems_version: 1.8.10
|
67
48
|
signing_key:
|
68
49
|
specification_version: 3
|
69
50
|
summary: An asynchronous Rack API for everyone.
|
70
51
|
test_files: []
|
71
|
-
|