aboutsummaryrefslogtreecommitdiff
path: root/vim/bundle/YouCompleteMe/third_party/retries/retries.py
diff options
context:
space:
mode:
Diffstat (limited to 'vim/bundle/YouCompleteMe/third_party/retries/retries.py')
-rw-r--r--vim/bundle/YouCompleteMe/third_party/retries/retries.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/vim/bundle/YouCompleteMe/third_party/retries/retries.py b/vim/bundle/YouCompleteMe/third_party/retries/retries.py
new file mode 100644
index 0000000..da7fa48
--- /dev/null
+++ b/vim/bundle/YouCompleteMe/third_party/retries/retries.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+#
+# Copyright 2012 by Jeff Laughlin Consulting LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+
+import sys
+from time import sleep
+
+# Source: https://gist.github.com/n1ywb/2570004
+
+def example_exc_handler(tries_remaining, exception, delay):
+ """Example exception handler; prints a warning to stderr.
+
+ tries_remaining: The number of tries remaining.
+ exception: The exception instance which was raised.
+ """
+ print >> sys.stderr, "Caught '%s', %d tries remaining, sleeping for %s seconds" % (exception, tries_remaining, delay)
+
+
+def retries(max_tries, delay=1, backoff=2, exceptions=(Exception,), hook=None):
+ """Function decorator implementing retrying logic.
+
+ delay: Sleep this many seconds * backoff * try number after failure
+ backoff: Multiply delay by this factor after each failure
+ exceptions: A tuple of exception classes; default (Exception,)
+ hook: A function with the signature myhook(tries_remaining, exception);
+ default None
+
+ The decorator will call the function up to max_tries times if it raises
+ an exception.
+
+ By default it catches instances of the Exception class and subclasses.
+ This will recover after all but the most fatal errors. You may specify a
+ custom tuple of exception classes with the 'exceptions' argument; the
+ function will only be retried if it raises one of the specified
+ exceptions.
+
+ Additionally you may specify a hook function which will be called prior
+ to retrying with the number of remaining tries and the exception instance;
+ see given example. This is primarily intended to give the opportunity to
+ log the failure. Hook is not called after failure if no retries remain.
+ """
+ def dec(func):
+ def f2(*args, **kwargs):
+ mydelay = delay
+ tries = reversed(range(max_tries))
+ for tries_remaining in tries:
+ try:
+ return func(*args, **kwargs)
+ except exceptions as e:
+ if tries_remaining > 0:
+ if hook is not None:
+ hook(tries_remaining, e, mydelay)
+ sleep(mydelay)
+ mydelay = mydelay * backoff
+ else:
+ raise
+ else:
+ break
+ return f2
+ return dec