summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2014-08-10 17:54:39 -0700
committerTodd Gamblin <tgamblin@llnl.gov>2014-08-10 17:54:39 -0700
commitd86a6380993edfe498bcd6c7d71b2cfff2ef986b (patch)
tree68f77f5e46948fe0c2f43b9363b1cc1b6083bbdb
parentca328a69935e5ed315caaec6d1435e4924e6ee63 (diff)
downloadspack-d86a6380993edfe498bcd6c7d71b2cfff2ef986b.tar.gz
spack-d86a6380993edfe498bcd6c7d71b2cfff2ef986b.tar.bz2
spack-d86a6380993edfe498bcd6c7d71b2cfff2ef986b.tar.xz
spack-d86a6380993edfe498bcd6c7d71b2cfff2ef986b.zip
Add Python 2.7 functools.total_ordering to external modules.
- removing dependence on 2.7 - added it to pyqver2 ads well
-rw-r--r--lib/spack/external/functools.py30
-rwxr-xr-xlib/spack/external/pyqver2.py1
-rw-r--r--lib/spack/spack/version.py3
3 files changed, 33 insertions, 1 deletions
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 @@ Functions = {
"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 os
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