diff --git a/rq/compat.py b/rq/compat.py new file mode 100644 index 0000000..a10576f --- /dev/null +++ b/rq/compat.py @@ -0,0 +1,41 @@ +import sys + + +def is_python_version(*versions): + for version in versions: + if (sys.version_info[0] == version[0] and + sys.version_info >= version): + return True + return False + + +# functools.total_ordering is only available from Python 2.7 and 3.2 +if is_python_version((2, 7), (3, 2)): + from functools import total_ordering +else: + def total_ordering(cls): # noqa + """Class decorator that fills in missing ordering methods""" + convert = { + '__lt__': [('__gt__', lambda self, other: other < self), + ('__le__', lambda self, other: not other < self), + ('__ge__', lambda self, other: not self < other)], + '__le__': [('__ge__', lambda self, other: other <= self), + ('__lt__', lambda self, other: not other <= self), + ('__gt__', lambda self, other: not self <= other)], + '__gt__': [('__lt__', lambda self, other: other > self), + ('__ge__', lambda self, other: not other > self), + ('__le__', lambda self, other: not self > other)], + '__ge__': [('__le__', lambda self, other: other >= self), + ('__gt__', lambda self, other: not other >= self), + ('__lt__', lambda self, other: not self >= other)] + } + roots = set(dir(cls)) & set(convert) + if not roots: + raise ValueError('must define at least one ordering operation: < > <= >=') # noqa + root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__ + for opname, opfunc in convert[root]: + if opname not in roots: + opfunc.__name__ = opname + opfunc.__doc__ = getattr(int, opname).__doc__ + setattr(cls, opname, opfunc) + return cls diff --git a/rq/queue.py b/rq/queue.py index f359595..6940b9b 100644 --- a/rq/queue.py +++ b/rq/queue.py @@ -1,8 +1,8 @@ import times -from functools import total_ordering from .connections import get_current_connection from .job import Job from .exceptions import NoSuchJobError, UnpickleError, InvalidJobOperationError +from .compat import total_ordering def get_failed_queue(connection=None):