NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)