From 4885458dde35e6b58e5eb5c9a1090c6ed2abbc95 Mon Sep 17 00:00:00 2001 From: Vincent Driessen Date: Sun, 1 Apr 2012 08:57:40 +0200 Subject: [PATCH] Move this hack to a separate file. --- rq/compat.py | 41 +++++++++++++++++++++++++++++++++++++++++ rq/queue.py | 29 +---------------------------- 2 files changed, 42 insertions(+), 28 deletions(-) create mode 100644 rq/compat.py diff --git a/rq/compat.py b/rq/compat.py new file mode 100644 index 0000000..6d02402 --- /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: not (self < other or self == other)), # noqa + ('__le__', lambda self, other: self < other or self == other), # noqa + ('__ge__', lambda self, other: not self < other)], + '__le__': [('__ge__', lambda self, other: not self <= other or self == other), # noqa + ('__lt__', lambda self, other: self <= other and not self == other), # noqa + ('__gt__', lambda self, other: not self <= other)], + '__gt__': [('__lt__', lambda self, other: not (self > other or self == other)), # noqa + ('__ge__', lambda self, other: self > other or self == other), # noqa + ('__le__', lambda self, other: not self > other)], + '__ge__': [('__le__', lambda self, other: (not self >= other) or self == other), # noqa + ('__gt__', lambda self, other: self >= other and not self == other), # noqa + ('__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 a8c27d4..6940b9b 100644 --- a/rq/queue.py +++ b/rq/queue.py @@ -2,34 +2,7 @@ import times from .connections import get_current_connection from .job import Job from .exceptions import NoSuchJobError, UnpickleError, InvalidJobOperationError - -""" Backport to work with Python 2.6 """ -def total_ordering(cls): - """Class decorator that fills in missing ordering methods""" - convert = { - '__lt__': [('__gt__', lambda self, other: not (self < other or self == other)), - ('__le__', lambda self, other: self < other or self == other), - ('__ge__', lambda self, other: not self < other)], - '__le__': [('__ge__', lambda self, other: not self <= other or self == other), - ('__lt__', lambda self, other: self <= other and not self == other), - ('__gt__', lambda self, other: not self <= other)], - '__gt__': [('__lt__', lambda self, other: not (self > other or self == other)), - ('__ge__', lambda self, other: self > other or self == other), - ('__le__', lambda self, other: not self > other)], - '__ge__': [('__le__', lambda self, other: (not self >= other) or self == other), - ('__gt__', lambda self, other: self >= other and not self == other), - ('__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: < > <= >=') - 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 +from .compat import total_ordering def get_failed_queue(connection=None):