2012-02-07 14:57:46 +02:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
import re
|
|
|
|
|
2012-02-08 16:11:04 +04:00
|
|
|
_REGEX = re.compile("^([0-9]+)" # major
|
|
|
|
"\.([0-9]+)" # minor
|
|
|
|
"\.([0-9]+)" # patch
|
|
|
|
"(\-[0-9A-Za-z]+(\.[0-9A-Za-z]+)*)?" # pre-release
|
|
|
|
"(\+[0-9A-Za-z]+(\.[0-9A-Za-z]+)*)?$") # build
|
2012-02-07 14:57:46 +02:00
|
|
|
|
|
|
|
def parse(version):
|
|
|
|
"""
|
|
|
|
Parse version to major, minor, patch, pre-release, build parts.
|
|
|
|
"""
|
2012-02-08 16:11:04 +04:00
|
|
|
match = _REGEX.match(version)
|
2012-02-07 14:57:46 +02:00
|
|
|
if match is None:
|
2012-02-08 16:08:24 +04:00
|
|
|
raise ValueError('%s is not valid SemVer string' % version)
|
2012-02-08 16:07:11 +04:00
|
|
|
|
|
|
|
rv = {
|
|
|
|
'major': int(match.group(1)),
|
|
|
|
'minor': int(match.group(2)),
|
|
|
|
'patch': int(match.group(3)),
|
|
|
|
}
|
|
|
|
|
2012-02-07 14:57:46 +02:00
|
|
|
if match.group(4):
|
|
|
|
rv['prerelease'] = match.group(4).lstrip('-')
|
|
|
|
|
|
|
|
if match.group(6):
|
|
|
|
rv['build'] = match.group(6).lstrip('+')
|
2012-02-08 16:07:11 +04:00
|
|
|
|
2012-02-07 14:57:46 +02:00
|
|
|
return rv
|
|
|
|
|
|
|
|
|
|
|
|
def compare(ver1, ver2):
|
|
|
|
def compare_by_keys(d1, d2, keys):
|
|
|
|
for key in keys:
|
|
|
|
v = cmp(d1.get(key), d2.get(key))
|
|
|
|
if v != 0:
|
|
|
|
return v
|
|
|
|
return 0
|
|
|
|
|
|
|
|
v1, v2 = parse(ver1), parse(ver2)
|
|
|
|
|
|
|
|
return compare_by_keys(
|
|
|
|
v1, v2, ['major', 'minor', 'patch', 'prerelease', 'build'])
|
|
|
|
|
|
|
|
|
|
|
|
def match(version, match_expr):
|
|
|
|
prefix = match_expr[:2]
|
|
|
|
if prefix in ('>=', '<=', '=='):
|
|
|
|
match_version = match_expr[2:]
|
2012-02-08 16:09:43 +04:00
|
|
|
elif prefix and prefix[0] in ('>', '<', '='):
|
2012-02-07 14:57:46 +02:00
|
|
|
prefix = prefix[0]
|
|
|
|
match_version = match_expr[1:]
|
|
|
|
else:
|
2012-02-08 16:07:11 +04:00
|
|
|
raise ValueError("match_expr parameter should be in format <op><ver>, "
|
|
|
|
"where <op> is one of ['<', '>', '==', '<=', '>=']. "
|
2012-02-08 16:09:43 +04:00
|
|
|
"You provided: %r" % match_expr)
|
2012-02-07 14:57:46 +02:00
|
|
|
|
|
|
|
possibilities_dict = {
|
|
|
|
'>': (1,),
|
|
|
|
'<': (-1,),
|
|
|
|
'==': (0,),
|
|
|
|
'>=': (0, 1),
|
2012-02-08 16:07:11 +04:00
|
|
|
'<=': (-1, 0)
|
|
|
|
}
|
|
|
|
|
2012-02-07 14:57:46 +02:00
|
|
|
possibilities = possibilities_dict[prefix]
|
|
|
|
cmp_res = compare(version, match_version)
|
|
|
|
|
2012-02-08 16:07:11 +04:00
|
|
|
return cmp_res in possibilities
|