From d86a6380993edfe498bcd6c7d71b2cfff2ef986b Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 10 Aug 2014 17:54:39 -0700 Subject: [PATCH] Add Python 2.7 functools.total_ordering to external modules. - removing dependence on 2.7 - added it to pyqver2 ads well --- lib/spack/external/functools.py | 30 ++++++++++++++++++++++++++++++ lib/spack/external/pyqver2.py | 1 + lib/spack/spack/version.py | 3 ++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 lib/spack/external/functools.py diff --git a/lib/spack/external/functools.py b/lib/spack/external/functools.py new file mode 100644 index 0000000000..19f0903c82 --- /dev/null +++ b/lib/spack/external/functools.py @@ -0,0 +1,30 @@ +# +# Backport of Python 2.7's total_ordering. +# + +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 diff --git a/lib/spack/external/pyqver2.py b/lib/spack/external/pyqver2.py index 875f8837fb..cd45bf948f 100755 --- a/lib/spack/external/pyqver2.py +++ b/lib/spack/external/pyqver2.py @@ -114,6 +114,7 @@ "collections.Counter": (2, 7), "collections.defaultdict": (2, 5), "collections.OrderedDict": (2, 7), + "functools.total_ordering": (2, 7), "enumerate": (2, 3), "frozenset": (2, 4), "itertools.compress": (2, 7), diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 4558f88384..fbf86db8e1 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -47,7 +47,8 @@ import sys import re from bisect import bisect_left -from functools import total_ordering, wraps +from functools import wraps +from external.functools import total_ordering import llnl.util.compare.none_high as none_high import llnl.util.compare.none_low as none_low