diff options
author | Todd Gamblin <tgamblin@llnl.gov> | 2014-08-10 17:54:39 -0700 |
---|---|---|
committer | Todd Gamblin <tgamblin@llnl.gov> | 2014-08-10 17:54:39 -0700 |
commit | d86a6380993edfe498bcd6c7d71b2cfff2ef986b (patch) | |
tree | 68f77f5e46948fe0c2f43b9363b1cc1b6083bbdb | |
parent | ca328a69935e5ed315caaec6d1435e4924e6ee63 (diff) | |
download | spack-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.py | 30 | ||||
-rwxr-xr-x | lib/spack/external/pyqver2.py | 1 | ||||
-rw-r--r-- | lib/spack/spack/version.py | 3 |
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 |