summaryrefslogtreecommitdiff
path: root/game/python-extra/mwclient/sleep.py
diff options
context:
space:
mode:
Diffstat (limited to 'game/python-extra/mwclient/sleep.py')
-rw-r--r--game/python-extra/mwclient/sleep.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/game/python-extra/mwclient/sleep.py b/game/python-extra/mwclient/sleep.py
new file mode 100644
index 0000000..2b808f6
--- /dev/null
+++ b/game/python-extra/mwclient/sleep.py
@@ -0,0 +1,88 @@
+import time
+import logging
+from mwclient.errors import MaximumRetriesExceeded
+
+log = logging.getLogger(__name__)
+
+
+class Sleepers(object):
+ """
+ A class that allows for the creation of multiple `Sleeper` objects with shared
+ arguments.
+ Examples:
+ Firstly a `Sleepers` object containing the shared attributes has to be created.
+ >>> max_retries, retry_timeout = 5, 5
+ >>> sleepers = Sleepers(max_retries, retry_timeout)
+ From this `Sleepers` object multiple individual `Sleeper` objects can be created
+ using the `make` method.
+ >>> sleeper = sleepers.make()
+ Args:
+ max_retries (int): The maximum number of retries to perform.
+ retry_timeout (int): The time to sleep for each past retry.
+ callback (Callable[[int, Any], None]): A callable to be called on each retry.
+ Attributes:
+ max_retries (int): The maximum number of retries to perform.
+ retry_timeout (int): The time to sleep for each past retry.
+ callback (callable): A callable to be called on each retry.
+ """
+ def __init__(self, max_retries, retry_timeout, callback=lambda *x: None):
+ self.max_retries = max_retries
+ self.retry_timeout = retry_timeout
+ self.callback = callback
+
+ def make(self, args=None):
+ """
+ Creates a new `Sleeper` object.
+ Args:
+ args (Any): Arguments to be passed to the `callback` callable.
+ Returns:
+ Sleeper: A `Sleeper` object.
+ """
+ return Sleeper(args, self.max_retries, self.retry_timeout, self.callback)
+
+
+class Sleeper(object):
+ """
+ For any given operation, a `Sleeper` object keeps count of the number of retries.
+ For each retry, the sleep time increases until the max number of retries is reached
+ and a `MaximumRetriesExceeded` is raised. The sleeper object should be discarded
+ once the operation is successful.
+ Args:
+ args (Any): Arguments to be passed to the `callback` callable.
+ max_retries (int): The maximum number of retries to perform.
+ retry_timeout (int): The time to sleep for each past retry.
+ callback (callable, None]): A callable to be called on each retry.
+ Attributes:
+ args (Any): Arguments to be passed to the `callback` callable.
+ retries (int): The number of retries that have been performed.
+ max_retries (int): The maximum number of retries to perform.
+ retry_timeout (int): The time to sleep for each past retry.
+ callback (callable): A callable to be called on each retry.
+ """
+ def __init__(self, args, max_retries, retry_timeout, callback):
+ self.args = args
+ self.retries = 0
+ self.max_retries = max_retries
+ self.retry_timeout = retry_timeout
+ self.callback = callback
+
+ def sleep(self, min_time=0):
+ """
+ Sleeps for a minimum of `min_time` seconds. The actual sleeping time will increase
+ with the number of retries.
+ Args:
+ min_time (int): The minimum sleeping time.
+ Raises:
+ MaximumRetriesExceeded: If the number of retries exceeds the maximum.
+ """
+ self.retries += 1
+ if self.retries > self.max_retries:
+ raise MaximumRetriesExceeded(self, self.args)
+
+ self.callback(self, self.retries, self.args)
+
+ timeout = self.retry_timeout * (self.retries - 1)
+ if timeout < min_time:
+ timeout = min_time
+ log.debug('Sleeping for %d seconds', timeout)
+ time.sleep(timeout)