1
1
import asyncio
2
-
3
- import busypie
4
2
import time
3
+ from functools import partial
4
+ from typing import Callable
5
5
6
+ import busypie
6
7
from busypie .condition import Condition
7
8
from busypie .func import describe
8
9
from busypie .types import Checker , ConditionEvaluator
@@ -16,36 +17,48 @@ def __init__(self, condition: 'Condition', evaluator_checker: Checker):
16
17
self ._last_error = None
17
18
18
19
def _validate_condition (self ):
19
- if self ._condition .poll_delay > self ._condition .wait_time_in_secs :
20
+ if self ._condition .poll_delay > self ._condition .max_wait_time :
20
21
raise ValueError ('Poll delay should be shorter than maximum wait constraint' )
22
+ if self ._condition .min_wait_time >= self ._condition .max_wait_time :
23
+ raise ValueError ('at least should be shorter than maximum wait constraint' )
21
24
22
25
async def wait_for (self , evaluator : ConditionEvaluator ) -> any :
23
26
start_time = time .time ()
27
+ time_bounds_checker = partial (self ._validate_wait_bounds , evaluator , start_time )
24
28
await asyncio .sleep (self ._condition .poll_delay )
25
29
while True :
26
30
try :
27
31
result = await self ._evaluator_check (evaluator )
28
32
if result :
33
+ time_bounds_checker (self .is_under_min_wait_time )
29
34
return result
30
35
except Exception as e :
31
36
self ._raise_exception_if_not_ignored (e )
32
37
self ._last_error = e
33
- self ._validate_wait_constraint ( evaluator , start_time )
38
+ time_bounds_checker ( self .is_max_wait_time_passed )
34
39
await asyncio .sleep (self ._condition .poll_interval )
35
40
41
+ def _validate_wait_bounds (self , condition_evaluator : ConditionEvaluator , start_time : float ,
42
+ constraint : Callable [[float ], bool ]):
43
+ execution_time = time .time () - start_time
44
+ if constraint (execution_time ):
45
+ raise busypie .ConditionTimeoutError (
46
+ self ._describe (condition_evaluator ), self ._condition .max_wait_time ) from self ._last_error
47
+
48
+ def _describe (self , condition_evaluator : ConditionEvaluator ) -> str :
49
+ return self ._condition .description or describe (condition_evaluator )
50
+
51
+ def is_under_min_wait_time (self , execute_time : float ):
52
+ return execute_time <= self ._condition .min_wait_time
53
+
36
54
def _raise_exception_if_not_ignored (self , e : Exception ):
37
55
ignored_exceptions = self ._condition .ignored_exceptions
38
56
if ignored_exceptions is None or \
39
57
(ignored_exceptions and e .__class__ not in ignored_exceptions ):
40
58
raise e
41
59
42
- def _validate_wait_constraint (self , condition_evaluator : ConditionEvaluator , start_time : float ):
43
- if (time .time () - start_time ) > self ._condition .wait_time_in_secs :
44
- raise busypie .ConditionTimeoutError (
45
- self ._describe (condition_evaluator ), self ._condition .wait_time_in_secs ) from self ._last_error
46
-
47
- def _describe (self , condition_evaluator : ConditionEvaluator ) -> str :
48
- return self ._condition .description or describe (condition_evaluator )
60
+ def is_max_wait_time_passed (self , execute_time : float ):
61
+ return execute_time > self ._condition .max_wait_time
49
62
50
63
51
64
class ReturnOnTimeoutAwaiter :
@@ -64,7 +77,7 @@ async def wait_for(self, evaluator: ConditionEvaluator) -> any:
64
77
65
78
66
79
class ConditionTimeoutError (Exception ):
67
- def __init__ (self , description : str , wait_time_in_secs : float ):
80
+ def __init__ (self , description : str , max_wait_time : float ):
68
81
super (ConditionTimeoutError , self ).__init__ ("Failed to meet condition of [{}] within {} seconds"
69
- .format (description , wait_time_in_secs ))
82
+ .format (description , max_wait_time ))
70
83
self .description = description
0 commit comments