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