bubble-wrap 1.8.0 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +14 -9
- data/CHANGELOG.md +21 -2
- data/Gemfile.lock +8 -5
- data/README.md +54 -3
- data/Rakefile +7 -1
- data/lib/bubble-wrap/camera.rb +1 -1
- data/lib/bubble-wrap/core.rb +1 -1
- data/lib/bubble-wrap/font.rb +1 -1
- data/lib/bubble-wrap/loader.rb +4 -4
- data/lib/bubble-wrap/media.rb +1 -1
- data/lib/bubble-wrap/motion.rb +7 -1
- data/lib/bubble-wrap/version.rb +2 -2
- data/motion/core/app.rb +4 -0
- data/motion/core/device/ios/camera_wrapper.rb +1 -1
- data/motion/core/device/ios/screen.rb +2 -2
- data/motion/core/device/osx/screen.rb +1 -1
- data/motion/core/device/screen.rb +1 -1
- data/motion/core/ios/device.rb +1 -1
- data/motion/core/ios/ns_index_path.rb +11 -0
- data/motion/core/json.rb +2 -2
- data/motion/core/kvo.rb +118 -55
- data/motion/core/ns_notification_center.rb +2 -2
- data/motion/core/ns_url_request.rb +2 -2
- data/motion/core/osx/device.rb +1 -1
- data/motion/core/string.rb +7 -7
- data/motion/font/font.rb +1 -1
- data/motion/ios/8/location_constants.rb +21 -0
- data/motion/location/location.rb +38 -18
- data/motion/mail/result.rb +1 -1
- data/motion/media/media.rb +1 -1
- data/motion/motion/accelerometer.rb +55 -0
- data/motion/motion/device_motion.rb +139 -0
- data/motion/motion/gyroscope.rb +55 -0
- data/motion/motion/magnetometer.rb +55 -0
- data/motion/motion/motion.rb +0 -288
- data/motion/reactor.rb +3 -3
- data/motion/reactor/deferrable.rb +32 -32
- data/motion/reactor/periodic_timer.rb +1 -1
- data/motion/reactor/queue.rb +6 -6
- data/motion/reactor/thread_aware_deferrable.rb +1 -1
- data/motion/reactor/timer.rb +1 -1
- data/motion/rss_parser.rb +6 -3
- data/motion/shortcut.rb +1 -1
- data/motion/sms/result.rb +1 -1
- data/motion/test_suite_delegate.rb +1 -1
- data/motion/ui/ui_activity_view_controller_wrapper.rb +6 -1
- data/motion/ui/ui_alert_view.rb +21 -1
- data/motion/util/deprecated.rb +1 -1
- data/samples/alert/Gemfile.lock +1 -1
- data/spec/lib/bubble-wrap/requirement_spec.rb +2 -2
- data/spec/lib/bubble-wrap_spec.rb +1 -1
- data/spec/lib/motion_stub.rb +1 -1
- data/spec/motion/core/app_spec.rb +6 -0
- data/spec/motion/core/device/osx/screen_spec.rb +1 -1
- data/spec/motion/core/ios/ns_index_path_spec.rb +20 -0
- data/spec/motion/core/kvo_spec.rb +171 -58
- data/spec/motion/core/ns_notification_center_spec.rb +3 -3
- data/spec/motion/core/string_spec.rb +16 -16
- data/spec/motion/core_spec.rb +3 -3
- data/spec/motion/font/font_spec.rb +1 -1
- data/spec/motion/location/location_spec.rb +61 -9
- data/spec/motion/mail/result_spec.rb +7 -7
- data/spec/motion/media/player_spec.rb +1 -1
- data/spec/motion/reactor/thread_aware_deferrable_spec.rb +3 -3
- data/spec/motion/sms/result_spec.rb +6 -6
- data/spec/motion/ui/ui_alert_view_spec.rb +59 -1
- data/spec/motion/util/deprecated_spec.rb +1 -1
- metadata +17 -4
- data/motion/ios/7/uiactivity_view_controller_constants.rb +0 -10
@@ -0,0 +1,55 @@
|
|
1
|
+
module BubbleWrap
|
2
|
+
module Motion
|
3
|
+
class Magnetometer < GenericMotionInterface
|
4
|
+
|
5
|
+
def start(options={}, &handler)
|
6
|
+
if options.key?(:interval)
|
7
|
+
@manager.magnetometerUpdateInterval = options[:interval]
|
8
|
+
end
|
9
|
+
|
10
|
+
if handler
|
11
|
+
queue = convert_queue(options[:queue])
|
12
|
+
@manager.startMagnetometerUpdatesToQueue(queue, withHandler: internal_handler(handler))
|
13
|
+
else
|
14
|
+
@manager.startMagnetometerUpdates
|
15
|
+
end
|
16
|
+
|
17
|
+
return self
|
18
|
+
end
|
19
|
+
|
20
|
+
private def handle_result(result_data, error, handler)
|
21
|
+
if result_data
|
22
|
+
result = {
|
23
|
+
data: result_data,
|
24
|
+
field: result_data.magneticField,
|
25
|
+
x: result_data.magneticField.x,
|
26
|
+
y: result_data.magneticField.y,
|
27
|
+
z: result_data.magneticField.z,
|
28
|
+
}
|
29
|
+
else
|
30
|
+
result = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
handler.call(result, error)
|
34
|
+
end
|
35
|
+
|
36
|
+
def available?
|
37
|
+
@manager.magnetometerAvailable?
|
38
|
+
end
|
39
|
+
|
40
|
+
def active?
|
41
|
+
@manager.magnetometerActive?
|
42
|
+
end
|
43
|
+
|
44
|
+
def data
|
45
|
+
@manager.magnetometerData
|
46
|
+
end
|
47
|
+
|
48
|
+
def stop
|
49
|
+
@manager.stopMagnetometerUpdates
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
data/motion/motion/motion.rb
CHANGED
@@ -129,293 +129,5 @@ module BubbleWrap
|
|
129
129
|
|
130
130
|
end
|
131
131
|
|
132
|
-
class Accelerometer < GenericMotionInterface
|
133
|
-
|
134
|
-
def start(options={}, &handler)
|
135
|
-
if options.key?(:interval)
|
136
|
-
@manager.accelerometerUpdateInterval = options[:interval]
|
137
|
-
end
|
138
|
-
|
139
|
-
if handler
|
140
|
-
queue = convert_queue(options[:queue])
|
141
|
-
@manager.startAccelerometerUpdatesToQueue(queue, withHandler: internal_handler(handler))
|
142
|
-
else
|
143
|
-
@manager.startAccelerometerUpdates
|
144
|
-
end
|
145
|
-
|
146
|
-
return self
|
147
|
-
end
|
148
|
-
|
149
|
-
private def handle_result(result_data, error, handler)
|
150
|
-
if result_data
|
151
|
-
result = {
|
152
|
-
data: result_data,
|
153
|
-
acceleration: result_data.acceleration,
|
154
|
-
x: result_data.acceleration.x,
|
155
|
-
y: result_data.acceleration.y,
|
156
|
-
z: result_data.acceleration.z,
|
157
|
-
}
|
158
|
-
else
|
159
|
-
result = nil
|
160
|
-
end
|
161
|
-
|
162
|
-
handler.call(result, error)
|
163
|
-
end
|
164
|
-
|
165
|
-
def available?
|
166
|
-
@manager.accelerometerAvailable?
|
167
|
-
end
|
168
|
-
|
169
|
-
def active?
|
170
|
-
@manager.accelerometerActive?
|
171
|
-
end
|
172
|
-
|
173
|
-
def data
|
174
|
-
@manager.accelerometerData
|
175
|
-
end
|
176
|
-
|
177
|
-
def stop
|
178
|
-
@manager.stopAccelerometerUpdates
|
179
|
-
end
|
180
|
-
|
181
|
-
end
|
182
|
-
|
183
|
-
class Gyroscope < GenericMotionInterface
|
184
|
-
|
185
|
-
def start(options={}, &handler)
|
186
|
-
if options.key?(:interval)
|
187
|
-
@manager.gyroUpdateInterval = options[:interval]
|
188
|
-
end
|
189
|
-
|
190
|
-
if handler
|
191
|
-
queue = convert_queue(options[:queue])
|
192
|
-
@manager.startGyroUpdatesToQueue(queue, withHandler: internal_handler(handler))
|
193
|
-
else
|
194
|
-
@manager.startGyroUpdates
|
195
|
-
end
|
196
|
-
|
197
|
-
return self
|
198
|
-
end
|
199
|
-
|
200
|
-
private def handle_result(result_data, error, handler)
|
201
|
-
if result_data
|
202
|
-
result = {
|
203
|
-
data: result_data,
|
204
|
-
rotation: result_data.rotationRate,
|
205
|
-
x: result_data.rotationRate.x,
|
206
|
-
y: result_data.rotationRate.y,
|
207
|
-
z: result_data.rotationRate.z,
|
208
|
-
}
|
209
|
-
else
|
210
|
-
result = nil
|
211
|
-
end
|
212
|
-
|
213
|
-
handler.call(result, error)
|
214
|
-
end
|
215
|
-
|
216
|
-
def available?
|
217
|
-
@manager.gyroAvailable?
|
218
|
-
end
|
219
|
-
|
220
|
-
def active?
|
221
|
-
@manager.gyroActive?
|
222
|
-
end
|
223
|
-
|
224
|
-
def data
|
225
|
-
@manager.gyroData
|
226
|
-
end
|
227
|
-
|
228
|
-
def stop
|
229
|
-
@manager.stopGyroUpdates
|
230
|
-
end
|
231
|
-
|
232
|
-
end
|
233
|
-
|
234
|
-
class Magnetometer < GenericMotionInterface
|
235
|
-
|
236
|
-
def start(options={}, &handler)
|
237
|
-
if options.key?(:interval)
|
238
|
-
@manager.magnetometerUpdateInterval = options[:interval]
|
239
|
-
end
|
240
|
-
|
241
|
-
if handler
|
242
|
-
queue = convert_queue(options[:queue])
|
243
|
-
@manager.startMagnetometerUpdatesToQueue(queue, withHandler: internal_handler(handler))
|
244
|
-
else
|
245
|
-
@manager.startMagnetometerUpdates
|
246
|
-
end
|
247
|
-
|
248
|
-
return self
|
249
|
-
end
|
250
|
-
|
251
|
-
private def handle_result(result_data, error, handler)
|
252
|
-
if result_data
|
253
|
-
result = {
|
254
|
-
data: result_data,
|
255
|
-
field: result_data.magneticField,
|
256
|
-
x: result_data.magneticField.x,
|
257
|
-
y: result_data.magneticField.y,
|
258
|
-
z: result_data.magneticField.z,
|
259
|
-
}
|
260
|
-
else
|
261
|
-
result = nil
|
262
|
-
end
|
263
|
-
|
264
|
-
handler.call(result, error)
|
265
|
-
end
|
266
|
-
|
267
|
-
def available?
|
268
|
-
@manager.magnetometerAvailable?
|
269
|
-
end
|
270
|
-
|
271
|
-
def active?
|
272
|
-
@manager.magnetometerActive?
|
273
|
-
end
|
274
|
-
|
275
|
-
def data
|
276
|
-
@manager.magnetometerData
|
277
|
-
end
|
278
|
-
|
279
|
-
def stop
|
280
|
-
@manager.stopMagnetometerUpdates
|
281
|
-
end
|
282
|
-
|
283
|
-
end
|
284
|
-
|
285
|
-
class DeviceMotion < GenericMotionInterface
|
286
|
-
|
287
|
-
def start(options={}, &handler)
|
288
|
-
if options.key?(:interval)
|
289
|
-
@manager.deviceMotionUpdateInterval = options[:interval]
|
290
|
-
end
|
291
|
-
|
292
|
-
if options.key?(:reference)
|
293
|
-
reference_frame = convert_reference_frame(options[:reference])
|
294
|
-
else
|
295
|
-
reference_frame = nil
|
296
|
-
end
|
297
|
-
|
298
|
-
if handler
|
299
|
-
queue = convert_queue(options[:queue])
|
300
|
-
|
301
|
-
if reference_frame
|
302
|
-
@manager.startDeviceMotionUpdatesUsingReferenceFrame(reference_frame, toQueue: queue, withHandler: internal_handler(handler))
|
303
|
-
else
|
304
|
-
@manager.startDeviceMotionUpdatesToQueue(queue, withHandler: internal_handler(handler))
|
305
|
-
end
|
306
|
-
else
|
307
|
-
if reference_frame
|
308
|
-
@manager.startDeviceMotionUpdatesUsingReferenceFrame(reference_frame)
|
309
|
-
else
|
310
|
-
@manager.startDeviceMotionUpdates
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
return self
|
315
|
-
end
|
316
|
-
|
317
|
-
private def handle_result(result_data, error, handler)
|
318
|
-
if result_data
|
319
|
-
result = {
|
320
|
-
data: result_data,
|
321
|
-
attitude: result_data.attitude,
|
322
|
-
rotation: result_data.rotationRate,
|
323
|
-
gravity: result_data.gravity,
|
324
|
-
acceleration: result_data.userAcceleration,
|
325
|
-
magnetic: result_data.magneticField,
|
326
|
-
}
|
327
|
-
|
328
|
-
if result_data.attitude
|
329
|
-
result.merge!({
|
330
|
-
roll: result_data.attitude.roll,
|
331
|
-
pitch: result_data.attitude.pitch,
|
332
|
-
yaw: result_data.attitude.yaw,
|
333
|
-
matrix: result_data.attitude.rotationMatrix,
|
334
|
-
quaternion: result_data.attitude.quaternion,
|
335
|
-
})
|
336
|
-
end
|
337
|
-
|
338
|
-
if result_data.rotationRate
|
339
|
-
result.merge!({
|
340
|
-
rotation_x: result_data.rotationRate.x,
|
341
|
-
rotation_y: result_data.rotationRate.y,
|
342
|
-
rotation_z: result_data.rotationRate.z,
|
343
|
-
})
|
344
|
-
end
|
345
|
-
|
346
|
-
if result_data.gravity
|
347
|
-
result.merge!({
|
348
|
-
gravity_x: result_data.gravity.x,
|
349
|
-
gravity_y: result_data.gravity.y,
|
350
|
-
gravity_z: result_data.gravity.z,
|
351
|
-
})
|
352
|
-
end
|
353
|
-
|
354
|
-
if result_data.userAcceleration
|
355
|
-
result.merge!({
|
356
|
-
acceleration_x: result_data.userAcceleration.x,
|
357
|
-
acceleration_y: result_data.userAcceleration.y,
|
358
|
-
acceleration_z: result_data.userAcceleration.z,
|
359
|
-
})
|
360
|
-
end
|
361
|
-
|
362
|
-
if result_data.magneticField
|
363
|
-
case result_data.magneticField.accuracy
|
364
|
-
when CMMagneticFieldCalibrationAccuracyLow
|
365
|
-
accuracy = :low
|
366
|
-
when CMMagneticFieldCalibrationAccuracyMedium
|
367
|
-
accuracy = :medium
|
368
|
-
when CMMagneticFieldCalibrationAccuracyHigh
|
369
|
-
accuracy = :high
|
370
|
-
end
|
371
|
-
|
372
|
-
result.merge!({
|
373
|
-
field: result_data.magneticField.field,
|
374
|
-
magnetic_x: result_data.magneticField.field.x,
|
375
|
-
magnetic_y: result_data.magneticField.field.y,
|
376
|
-
magnetic_z: result_data.magneticField.field.z,
|
377
|
-
magnetic_accuracy: accuracy,
|
378
|
-
})
|
379
|
-
end
|
380
|
-
else
|
381
|
-
result = nil
|
382
|
-
end
|
383
|
-
|
384
|
-
handler.call(result, error)
|
385
|
-
end
|
386
|
-
|
387
|
-
def convert_reference_frame(reference_frame)
|
388
|
-
case reference_frame
|
389
|
-
when :arbitrary_z
|
390
|
-
CMAttitudeReferenceFrameXArbitraryZVertical
|
391
|
-
when :corrected_z
|
392
|
-
CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
|
393
|
-
when :magnetic_north
|
394
|
-
CMAttitudeReferenceFrameXMagneticNorthZVertical
|
395
|
-
when :true_north
|
396
|
-
CMAttitudeReferenceFrameXTrueNorthZVertical
|
397
|
-
else
|
398
|
-
reference_frame
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
|
-
def available?
|
403
|
-
@manager.deviceMotionAvailable?
|
404
|
-
end
|
405
|
-
|
406
|
-
def active?
|
407
|
-
@manager.deviceMotionActive?
|
408
|
-
end
|
409
|
-
|
410
|
-
def data
|
411
|
-
@manager.deviceMotion
|
412
|
-
end
|
413
|
-
|
414
|
-
def stop
|
415
|
-
@manager.stopDeviceMotionUpdates
|
416
|
-
end
|
417
|
-
|
418
|
-
end
|
419
|
-
|
420
132
|
end
|
421
133
|
end
|
data/motion/reactor.rb
CHANGED
@@ -67,7 +67,7 @@ module BubbleWrap
|
|
67
67
|
# parameter (the "operation") and schedule it for asynchronous execution
|
68
68
|
# on a GCD concurrency queue. When the operation completes the result (if any)
|
69
69
|
# is passed into the callback (if present).
|
70
|
-
def defer(op=nil,cb=nil,&blk)
|
70
|
+
def defer(op=nil,cb=nil,&blk)
|
71
71
|
schedule do
|
72
72
|
result = (op||blk).call
|
73
73
|
schedule(result, &cb) if cb
|
@@ -76,7 +76,7 @@ module BubbleWrap
|
|
76
76
|
|
77
77
|
# A version of `defer` which schedules both the operator
|
78
78
|
# and callback operations on the application's main thread.
|
79
|
-
def defer_on_main(op=nil,cb=nil,&blk)
|
79
|
+
def defer_on_main(op=nil,cb=nil,&blk)
|
80
80
|
schedule_on_main do
|
81
81
|
result = (op||blk).call
|
82
82
|
schedule_on_main(result, &cb) if cb
|
@@ -105,7 +105,7 @@ module BubbleWrap
|
|
105
105
|
end
|
106
106
|
::Dispatch::Queue.main.async &cb
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -7,13 +7,13 @@ module BubbleWrap
|
|
7
7
|
# base.extend ::BubbleWrap::Reactor::Future
|
8
8
|
# end
|
9
9
|
|
10
|
-
# Specify a block to be executed if and when the Deferrable object
|
11
|
-
# receives a status of :succeeded. See set_deferred_status for more
|
10
|
+
# Specify a block to be executed if and when the Deferrable object
|
11
|
+
# receives a status of :succeeded. See set_deferred_status for more
|
12
12
|
# information.
|
13
|
-
# Calling this method on a Deferrable object whose status is not yet
|
14
|
-
# known will cause the callback block to be stored on an internal
|
15
|
-
# list. If you call this method on a Deferrable whose status is
|
16
|
-
# :succeeded, the block will be executed immediately, receiving
|
13
|
+
# Calling this method on a Deferrable object whose status is not yet
|
14
|
+
# known will cause the callback block to be stored on an internal
|
15
|
+
# list. If you call this method on a Deferrable whose status is
|
16
|
+
# :succeeded, the block will be executed immediately, receiving
|
17
17
|
# the parameters given to the prior set_deferred_status call.
|
18
18
|
def callback(&blk)
|
19
19
|
return unless blk
|
@@ -35,8 +35,8 @@ module BubbleWrap
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
# Specify a block to be executed if and when the Deferrable object
|
39
|
-
# receives a status of :failed. See set_deferred_status for more
|
38
|
+
# Specify a block to be executed if and when the Deferrable object
|
39
|
+
# receives a status of :failed. See set_deferred_status for more
|
40
40
|
# information.
|
41
41
|
def errback(&blk)
|
42
42
|
return unless blk
|
@@ -46,7 +46,7 @@ module BubbleWrap
|
|
46
46
|
blk.call(*@deferred_args)
|
47
47
|
elsif @deferred_status != :succeeded
|
48
48
|
@errbacks ||= []
|
49
|
-
@errbacks.unshift blk
|
49
|
+
@errbacks.unshift blk
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -81,31 +81,31 @@ module BubbleWrap
|
|
81
81
|
end
|
82
82
|
alias set_deferred_failure fail
|
83
83
|
|
84
|
-
# Sets the “disposition” (status) of the Deferrable object. See also
|
85
|
-
# the large set of sugarings for this method. Note that if you call
|
86
|
-
# this method without arguments, no arguments will be passed to the
|
87
|
-
# callback/errback. If the user has coded these with arguments,
|
88
|
-
# then the user code will throw an argument exception. Implementors
|
89
|
-
# of deferrable classes must document the arguments they will supply
|
84
|
+
# Sets the “disposition” (status) of the Deferrable object. See also
|
85
|
+
# the large set of sugarings for this method. Note that if you call
|
86
|
+
# this method without arguments, no arguments will be passed to the
|
87
|
+
# callback/errback. If the user has coded these with arguments,
|
88
|
+
# then the user code will throw an argument exception. Implementors
|
89
|
+
# of deferrable classes must document the arguments they will supply
|
90
90
|
# to user callbacks.
|
91
|
-
# OBSERVE SOMETHING VERY SPECIAL here: you may call this method even
|
92
|
-
# on the INSIDE of a callback. This is very useful when a
|
93
|
-
# previously-registered callback wants to change the parameters that
|
91
|
+
# OBSERVE SOMETHING VERY SPECIAL here: you may call this method even
|
92
|
+
# on the INSIDE of a callback. This is very useful when a
|
93
|
+
# previously-registered callback wants to change the parameters that
|
94
94
|
# will be passed to subsequently-registered ones.
|
95
95
|
# You may give either :succeeded or :failed as the status argument.
|
96
|
-
# If you pass :succeeded, then all of the blocks passed to the object
|
97
|
-
# using the callback method (if any) will be executed BEFORE the
|
98
|
-
# set_deferred_status method returns. All of the blocks passed to the
|
96
|
+
# If you pass :succeeded, then all of the blocks passed to the object
|
97
|
+
# using the callback method (if any) will be executed BEFORE the
|
98
|
+
# set_deferred_status method returns. All of the blocks passed to the
|
99
99
|
# object using errback will be discarded.
|
100
|
-
# If you pass :failed, then all of the blocks passed to the object
|
101
|
-
# using the errback method (if any) will be executed BEFORE the
|
102
|
-
# set_deferred_status method returns. All of the blocks passed to the
|
100
|
+
# If you pass :failed, then all of the blocks passed to the object
|
101
|
+
# using the errback method (if any) will be executed BEFORE the
|
102
|
+
# set_deferred_status method returns. All of the blocks passed to the
|
103
103
|
# object using # callback will be discarded.
|
104
|
-
# If you pass any arguments to set_deferred_status in addition to the
|
105
|
-
# status argument, they will be passed as arguments to any callbacks
|
106
|
-
# or errbacks that are executed. It’s your responsibility to ensure
|
107
|
-
# that the argument lists specified in your callbacks and errbacks match
|
108
|
-
# the arguments given in calls to set_deferred_status, otherwise Ruby
|
104
|
+
# If you pass any arguments to set_deferred_status in addition to the
|
105
|
+
# status argument, they will be passed as arguments to any callbacks
|
106
|
+
# or errbacks that are executed. It’s your responsibility to ensure
|
107
|
+
# that the argument lists specified in your callbacks and errbacks match
|
108
|
+
# the arguments given in calls to set_deferred_status, otherwise Ruby
|
109
109
|
# will raise an ArgumentError.
|
110
110
|
def set_deferred_status(status, *args)
|
111
111
|
cancel_timeout
|
@@ -137,9 +137,9 @@ module BubbleWrap
|
|
137
137
|
end
|
138
138
|
alias set_deferred_success succeed
|
139
139
|
|
140
|
-
# Setting a timeout on a Deferrable causes it to go into the failed
|
141
|
-
# state after the Timeout expires (passing no arguments to the object’s
|
142
|
-
# errbacks). Setting the status at any time prior to a call to the
|
140
|
+
# Setting a timeout on a Deferrable causes it to go into the failed
|
141
|
+
# state after the Timeout expires (passing no arguments to the object’s
|
142
|
+
# errbacks). Setting the status at any time prior to a call to the
|
143
143
|
# expiration of the timeout will cause the timer to be cancelled.
|
144
144
|
def timeout(seconds)
|
145
145
|
cancel_timeout
|