async_sinatra 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -0
- data/lib/sinatra/async.rb +22 -13
- data/test/test_async.rb +35 -1
- metadata +3 -3
data/Rakefile
CHANGED
@@ -93,4 +93,5 @@ desc "Release #{gem_task.gem_spec.file_name}"
|
|
93
93
|
task :release => [:tag, :gem, :publish] do |t|
|
94
94
|
sh "rubyforge add_release #{spec.rubyforge_project} #{spec.name} #{spec.version} #{gem_task.package_dir}/#{gem_task.gem_spec.file_name}"
|
95
95
|
sh "gem push #{gem_task.package_dir}/#{gem_task.gem_spec.file_name}"
|
96
|
+
sh "git push --all --tags"
|
96
97
|
end
|
data/lib/sinatra/async.rb
CHANGED
@@ -85,32 +85,41 @@ module Sinatra #:nodoc:
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
88
|
+
# async_schedule is used to schedule work in a future context, the block
|
89
|
+
# is wrapped up so that exceptions and halts (redirect, etc) are handled
|
90
|
+
# correctly.
|
91
91
|
def async_schedule(&b)
|
92
92
|
if options.environment == :test
|
93
93
|
options.set :async_schedules, [] unless options.respond_to? :async_schedules
|
94
|
-
options.async_schedules << b
|
94
|
+
options.async_schedules << lambda { async_catch_execute(&b) }
|
95
95
|
else
|
96
|
-
|
96
|
+
native_async_schedule { async_catch_execute(&b) }
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
+
# By default native_async_schedule calls EventMachine#next_tick, if
|
101
|
+
# you're using threads or some other scheduling mechanism, it must take
|
102
|
+
# the block passed here and schedule it for running in the future.
|
103
|
+
def native_async_schedule(&b)
|
104
|
+
EM.next_tick(&b)
|
105
|
+
end
|
106
|
+
|
100
107
|
# Defaults to throw async as that is most commonly used by servers.
|
101
108
|
def async_response
|
102
109
|
throw :async
|
103
110
|
end
|
104
111
|
|
105
112
|
def async_runner(method, *bargs)
|
106
|
-
async_schedule
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
113
|
+
async_schedule { __send__(method, *bargs); nil }
|
114
|
+
end
|
115
|
+
|
116
|
+
def async_catch_execute(&b)
|
117
|
+
@async_running = true
|
118
|
+
async_handle_exception do
|
119
|
+
if h = catch(:halt, &b)
|
120
|
+
invoke { halt h }
|
121
|
+
invoke { error_block! response.status }
|
122
|
+
body(response.body)
|
114
123
|
end
|
115
124
|
end
|
116
125
|
end
|
data/test/test_async.rb
CHANGED
@@ -43,7 +43,7 @@ class TestSinatraAsync < Test::Unit::TestCase
|
|
43
43
|
end
|
44
44
|
|
45
45
|
aget '/em_halt' do
|
46
|
-
|
46
|
+
em_async_schedule { ahalt 404 }
|
47
47
|
end
|
48
48
|
|
49
49
|
aget '/s401' do
|
@@ -69,6 +69,25 @@ class TestSinatraAsync < Test::Unit::TestCase
|
|
69
69
|
aget '/redirect' do
|
70
70
|
redirect '/'
|
71
71
|
end
|
72
|
+
|
73
|
+
aget '/aredirect' do
|
74
|
+
async_schedule { redirect '/' }
|
75
|
+
end
|
76
|
+
|
77
|
+
aget '/emredirect' do
|
78
|
+
em_async_schedule { redirect '/' }
|
79
|
+
end
|
80
|
+
|
81
|
+
# Defeat the test environment semantics, ensuring we actually follow the
|
82
|
+
# non-test branch of async_schedule. You would normally just call
|
83
|
+
# async_schedule in user apps, and use test helpers appropriately.
|
84
|
+
def em_async_schedule
|
85
|
+
o = self.class.environment
|
86
|
+
self.class.set :environment, :normal
|
87
|
+
async_schedule { yield }
|
88
|
+
ensure
|
89
|
+
self.class.set :environment, o
|
90
|
+
end
|
72
91
|
end
|
73
92
|
|
74
93
|
def app
|
@@ -154,4 +173,19 @@ class TestSinatraAsync < Test::Unit::TestCase
|
|
154
173
|
assert_equal 302, last_response.status
|
155
174
|
assert_equal '/', last_response.location
|
156
175
|
end
|
176
|
+
|
177
|
+
def test_aredirect
|
178
|
+
aget '/aredirect'
|
179
|
+
assert last_response.redirect?
|
180
|
+
assert_equal 302, last_response.status
|
181
|
+
assert_equal '/', last_response.location
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_emredirect
|
185
|
+
aget '/emredirect'
|
186
|
+
em_async_continue
|
187
|
+
assert last_response.redirect?
|
188
|
+
assert_equal 302, last_response.status
|
189
|
+
assert_equal '/', last_response.location
|
190
|
+
end
|
157
191
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async_sinatra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 2
|
9
8
|
- 3
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- James Tucker
|