versionpredicate.py (2501B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\versionpredicate.py 2 import re 3 import distutils.version 4 import operator 5 re_validPackage = re.compile('(?i)^\\s*([a-z_]\\w*(?:\\.[a-z_]\\w*)*)(.*)') 6 re_paren = re.compile('^\\s*\\((.*)\\)\\s*$') 7 re_splitComparison = re.compile('^\\s*(<=|>=|<|>|!=|==)\\s*([^\\s,]+)\\s*$') 8 9 def splitUp(pred): 10 res = re_splitComparison.match(pred) 11 if not res: 12 raise ValueError('bad package restriction syntax: %r' % pred) 13 comp, verStr = res.groups() 14 return (comp, distutils.version.StrictVersion(verStr)) 15 16 17 compmap = {'<': operator.lt, 18 '<=': operator.le, 19 '==': operator.eq, 20 '>': operator.gt, 21 '>=': operator.ge, 22 '!=': operator.ne} 23 24 class VersionPredicate: 25 26 def __init__(self, versionPredicateStr): 27 versionPredicateStr = versionPredicateStr.strip() 28 if not versionPredicateStr: 29 raise ValueError('empty package restriction') 30 match = re_validPackage.match(versionPredicateStr) 31 if not match: 32 raise ValueError('bad package name in %r' % versionPredicateStr) 33 self.name, paren = match.groups() 34 paren = paren.strip() 35 if paren: 36 match = re_paren.match(paren) 37 if not match: 38 raise ValueError('expected parenthesized list: %r' % paren) 39 str = match.groups()[0] 40 self.pred = [ splitUp(aPred) for aPred in str.split(',') ] 41 if not self.pred: 42 raise ValueError('empty parenthesized list in %r' % versionPredicateStr) 43 else: 44 self.pred = [] 45 46 def __str__(self): 47 if self.pred: 48 seq = [ cond + ' ' + str(ver) for cond, ver in self.pred ] 49 return self.name + ' (' + ', '.join(seq) + ')' 50 else: 51 return self.name 52 53 def satisfied_by(self, version): 54 for cond, ver in self.pred: 55 if not compmap[cond](version, ver): 56 return False 57 58 return True 59 60 61 _provision_rx = None 62 63 def split_provision(value): 64 global _provision_rx 65 if _provision_rx is None: 66 _provision_rx = re.compile('([a-zA-Z_]\\w*(?:\\.[a-zA-Z_]\\w*)*)(?:\\s*\\(\\s*([^)\\s]+)\\s*\\))?$') 67 value = value.strip() 68 m = _provision_rx.match(value) 69 if not m: 70 raise ValueError('illegal provides specification: %r' % value) 71 ver = m.group(2) or None 72 if ver: 73 ver = distutils.version.StrictVersion(ver) 74 return (m.group(1), ver)