mach-nix/mach_nix/versions.py
2020-11-21 13:34:51 +07:00

71 lines
2 KiB
Python

import sys
import traceback
from typing import Iterable
import packaging.version
from conda.common.compat import with_metaclass
from conda.models.version import ver_eval, VersionOrder, SingleStrArgCachingType
@with_metaclass(SingleStrArgCachingType)
class Version(VersionOrder):
pass
class PyVer(VersionOrder):
def __init__(self, vstr):
self.pypa_ver = packaging.version.Version(vstr)
super(PyVer, self).__init__(vstr)
def nix(self):
res = 'python'
res += str(self.pypa_ver.release[0])
if len(self.pypa_ver.release) >= 2:
res += str(self.pypa_ver.release[1])
return res
def digits(self):
return ''.join(filter(lambda c: c.isdigit(), str(self.pypa_ver)))[:2]
def python_version(self):
return f"{self.pypa_ver.release[0]}.{self.pypa_ver.release[1]}"
def python_full_version(self):
try:
return f"{self.pypa_ver.release[0]}.{self.pypa_ver.release[1]}.{self.pypa_ver.release[2]}"
except IndexError:
traceback.print_exc()
print("Error: please specify full python version including bugfix version (like 3.7.5)", file=sys.stderr)
exit(1)
def parse_ver(ver_str) -> Version:
return Version(ver_str)
def ver_better_than_other(v: Version, o: Version) -> bool:
return ver_eval(v, f">{o}")
def ver_sort_key(ver: Version):
"""
For sorting versions by preference in reversed order. (last elem == highest preference)
"""
is_dev = 0
is_pre = 0
for component in ver.version:
if len(component) > 1:
for elem in component:
if not isinstance(elem, str):
continue
if 'dev' in elem.lower():
is_dev = 1
break
# contains letters == pre-release
if elem.lower().islower():
is_pre = 1
break
return not is_dev, not is_pre, ver
def best_version(versions: Iterable[Version]) -> Version:
return sorted(versions)[-1]