2020-04-22 09:28:58 +00:00
|
|
|
import sys
|
|
|
|
import traceback
|
2020-11-20 17:08:20 +00:00
|
|
|
from typing import Iterable
|
2020-04-22 09:28:58 +00:00
|
|
|
|
2020-11-19 05:16:04 +00:00
|
|
|
import packaging.version
|
2020-10-25 18:09:37 +00:00
|
|
|
from conda.common.compat import with_metaclass
|
|
|
|
from conda.models.version import ver_eval, VersionOrder, SingleStrArgCachingType
|
2020-08-07 07:35:50 +00:00
|
|
|
|
2020-04-22 09:28:58 +00:00
|
|
|
|
2020-10-26 07:07:15 +00:00
|
|
|
@with_metaclass(SingleStrArgCachingType)
|
|
|
|
class Version(VersionOrder):
|
|
|
|
pass
|
2020-10-25 18:09:37 +00:00
|
|
|
|
|
|
|
|
2020-11-21 06:34:51 +00:00
|
|
|
class PyVer(VersionOrder):
|
2020-10-25 18:09:37 +00:00
|
|
|
def __init__(self, vstr):
|
|
|
|
self.pypa_ver = packaging.version.Version(vstr)
|
|
|
|
super(PyVer, self).__init__(vstr)
|
2020-04-22 09:28:58 +00:00
|
|
|
def nix(self):
|
|
|
|
res = 'python'
|
2020-10-25 18:09:37 +00:00
|
|
|
res += str(self.pypa_ver.release[0])
|
|
|
|
if len(self.pypa_ver.release) >= 2:
|
|
|
|
res += str(self.pypa_ver.release[1])
|
2020-04-22 09:28:58 +00:00
|
|
|
return res
|
|
|
|
|
|
|
|
def digits(self):
|
2020-10-25 18:09:37 +00:00
|
|
|
return ''.join(filter(lambda c: c.isdigit(), str(self.pypa_ver)))[:2]
|
2020-04-22 09:28:58 +00:00
|
|
|
|
|
|
|
def python_version(self):
|
2020-10-25 18:09:37 +00:00
|
|
|
return f"{self.pypa_ver.release[0]}.{self.pypa_ver.release[1]}"
|
2020-04-22 09:28:58 +00:00
|
|
|
|
|
|
|
def python_full_version(self):
|
|
|
|
try:
|
2020-10-25 18:09:37 +00:00
|
|
|
return f"{self.pypa_ver.release[0]}.{self.pypa_ver.release[1]}.{self.pypa_ver.release[2]}"
|
2020-04-22 09:28:58 +00:00
|
|
|
except IndexError:
|
|
|
|
traceback.print_exc()
|
|
|
|
print("Error: please specify full python version including bugfix version (like 3.7.5)", file=sys.stderr)
|
|
|
|
exit(1)
|
|
|
|
|
|
|
|
|
2020-10-25 18:09:37 +00:00
|
|
|
def parse_ver(ver_str) -> Version:
|
|
|
|
return Version(ver_str)
|
2020-10-25 05:09:08 +00:00
|
|
|
|
|
|
|
|
2020-04-22 09:28:58 +00:00
|
|
|
def ver_better_than_other(v: Version, o: Version) -> bool:
|
2020-10-25 18:09:37 +00:00
|
|
|
return ver_eval(v, f">{o}")
|
2020-04-22 09:28:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
def ver_sort_key(ver: Version):
|
2020-05-19 09:46:48 +00:00
|
|
|
"""
|
|
|
|
For sorting versions by preference in reversed order. (last elem == highest preference)
|
|
|
|
"""
|
2020-10-25 18:09:37 +00:00
|
|
|
is_dev = 0
|
2020-10-27 02:46:33 +00:00
|
|
|
is_pre = 0
|
2020-10-25 18:09:37 +00:00
|
|
|
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
|
2020-10-27 02:46:33 +00:00
|
|
|
# contains letters == pre-release
|
|
|
|
if elem.lower().islower():
|
|
|
|
is_pre = 1
|
2020-10-25 18:09:37 +00:00
|
|
|
break
|
2020-10-27 02:46:33 +00:00
|
|
|
return not is_dev, not is_pre, ver
|
2020-04-22 09:28:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
def best_version(versions: Iterable[Version]) -> Version:
|
2020-10-25 18:09:37 +00:00
|
|
|
return sorted(versions)[-1]
|