Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/backoff/_sync.py: 11%

71 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-07 06:35 +0000

1# coding:utf-8 

2import datetime 

3import functools 

4import time 

5from datetime import timedelta 

6 

7from backoff._common import (_init_wait_gen, _maybe_call, _next_wait) 

8 

9 

10def _call_handlers(hdlrs, target, args, kwargs, tries, elapsed, **extra): 

11 details = { 

12 'target': target, 

13 'args': args, 

14 'kwargs': kwargs, 

15 'tries': tries, 

16 'elapsed': elapsed, 

17 } 

18 details.update(extra) 

19 for hdlr in hdlrs: 

20 hdlr(details) 

21 

22 

23def retry_predicate(target, wait_gen, predicate, 

24 *, 

25 max_tries, max_time, jitter, 

26 on_success, on_backoff, on_giveup, 

27 wait_gen_kwargs): 

28 

29 @functools.wraps(target) 

30 def retry(*args, **kwargs): 

31 max_tries_value = _maybe_call(max_tries) 

32 max_time_value = _maybe_call(max_time) 

33 

34 tries = 0 

35 start = datetime.datetime.now() 

36 wait = _init_wait_gen(wait_gen, wait_gen_kwargs) 

37 while True: 

38 tries += 1 

39 elapsed = timedelta.total_seconds(datetime.datetime.now() - start) 

40 details = { 

41 "target": target, 

42 "args": args, 

43 "kwargs": kwargs, 

44 "tries": tries, 

45 "elapsed": elapsed, 

46 } 

47 

48 ret = target(*args, **kwargs) 

49 if predicate(ret): 

50 max_tries_exceeded = (tries == max_tries_value) 

51 max_time_exceeded = (max_time_value is not None and 

52 elapsed >= max_time_value) 

53 

54 if max_tries_exceeded or max_time_exceeded: 

55 _call_handlers(on_giveup, **details, value=ret) 

56 break 

57 

58 try: 

59 seconds = _next_wait(wait, ret, jitter, elapsed, 

60 max_time_value) 

61 except StopIteration: 

62 _call_handlers(on_giveup, **details) 

63 break 

64 

65 _call_handlers(on_backoff, **details, 

66 value=ret, wait=seconds) 

67 

68 time.sleep(seconds) 

69 continue 

70 else: 

71 _call_handlers(on_success, **details, value=ret) 

72 break 

73 

74 return ret 

75 

76 return retry 

77 

78 

79def retry_exception(target, wait_gen, exception, 

80 *, 

81 max_tries, max_time, jitter, giveup, 

82 on_success, on_backoff, on_giveup, raise_on_giveup, 

83 wait_gen_kwargs): 

84 

85 @functools.wraps(target) 

86 def retry(*args, **kwargs): 

87 max_tries_value = _maybe_call(max_tries) 

88 max_time_value = _maybe_call(max_time) 

89 

90 tries = 0 

91 start = datetime.datetime.now() 

92 wait = _init_wait_gen(wait_gen, wait_gen_kwargs) 

93 while True: 

94 tries += 1 

95 elapsed = timedelta.total_seconds(datetime.datetime.now() - start) 

96 details = { 

97 "target": target, 

98 "args": args, 

99 "kwargs": kwargs, 

100 "tries": tries, 

101 "elapsed": elapsed, 

102 } 

103 

104 try: 

105 ret = target(*args, **kwargs) 

106 except exception as e: 

107 max_tries_exceeded = (tries == max_tries_value) 

108 max_time_exceeded = (max_time_value is not None and 

109 elapsed >= max_time_value) 

110 

111 if giveup(e) or max_tries_exceeded or max_time_exceeded: 

112 _call_handlers(on_giveup, **details, exception=e) 

113 if raise_on_giveup: 

114 raise 

115 return None 

116 

117 try: 

118 seconds = _next_wait(wait, e, jitter, elapsed, 

119 max_time_value) 

120 except StopIteration: 

121 _call_handlers(on_giveup, **details, exception=e) 

122 raise e 

123 

124 _call_handlers(on_backoff, **details, wait=seconds, 

125 exception=e) 

126 

127 time.sleep(seconds) 

128 else: 

129 _call_handlers(on_success, **details) 

130 

131 return ret 

132 return retry