rack-async 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/rack/async.rb +68 -37
  2. metadata +21 -41
@@ -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 @finished && empty?
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 succeed
61
- @finished = true
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
- @each_callback.call(data)
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
- def succeed
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
- hash: 29
5
- prerelease: false
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
- hash: 3
51
- segments:
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
- hash: 3
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.3.7
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
-