Added to compare the full version number.

Added lazy evaluation for the conditions '&&'
develop
Самоукин Алексей 14 years ago
parent 1588b970cd
commit 0cfef275ed

@ -27,6 +27,8 @@ import string
import time
import glob
import fcntl
# < <= == != >= >
from operator import lt, le, eq, ne, ge, gt
# Переопределение exit
@ -57,40 +59,111 @@ class _terms(_error, _shareTermsFunction):
# регулярное выражение для поиска функции в шаблоне
_reFunction = re.compile(_shareTermsFunction._reFunctionText)
# регулярное выражение для не версии
_re_not_Version = re.compile("[^0-9\.]|^$")
_re_not_Version = re.compile("[^0-9\.]")
# регулярное выражение не номер
_re_not_Number = re.compile("[^0-9]")
_suffixDict = {"pre": -2, "p": 0, "alpha": -4, "beta": -3, "rc": -1}
_lenSuffixDict = len(_suffixDict)
# Регулярное выражение для названия переменной
_reDenyName = re.compile("[^a-zA-Z0-9\_\-]")
# Регулярное выражение для сравниваемого значения
_reDenyValue = re.compile("[^0-9a-zA-Z_/\.-]")
# латинские буквы в нижнем регистре
_letters = list(string.ascii_lowercase)
def _splitVersion(self, strVersion):
"""Split version"""
strWorkVersion, spl, rVersion = strVersion.rpartition("-")
if rVersion == strVersion:
strWorkVersion = rVersion
rVersion = ""
numberVersion, spl, suffix = strWorkVersion.partition("_")
suffSpl = ""
suffixVersion = ""
if suffix:
suffSplList = filter(lambda x: suffix.startswith(x),
self._suffixDict.keys())
if suffSplList:
suffSpl = suffSplList[0]
lenSuffSpl = len(suffSpl)
suffixVersion = suffix[lenSuffSpl:]
letters = ""
if numberVersion and numberVersion[-1:] in self._letters:
letters = numberVersion[-1:]
numberVersion = numberVersion[:-1]
return numberVersion, letters, suffSpl, suffixVersion, rVersion
def _notVersion(self, strVersion):
"""strVersion is not version - True"""
numberVersion, letters, suffSpl, suffixVersion, rVersion =\
self._splitVersion(strVersion)
if not numberVersion.strip():
return True
if self._re_not_Version.search(numberVersion):
return True
if letters and not letters in self._letters:
return True
if suffixVersion and self._re_not_Number.search(suffixVersion):
return True
if rVersion:
if rVersion[0] != "r" or len(rVersion) == 1:
return True
if self._re_not_Number.search(rVersion[1:]):
return True
return False
def _convertVers(self, verA, verB):
"""Конвертирование номеров версий для корректного сравнения
"""
elemA = verA.split(".")
elemB = verB.split(".")
if len(elemA) > len(elemB):
maxElemB = len(elemB)-1
for i in range(len(elemA)):
if i > maxElemB:
elemB.append("0")
else:
maxElemA = len(elemA)-1
def fillZero(elemA, elemB):
#elemA, elemB = elemA[], elemB[]
if len(elemA) > len(elemB):
maxElemB = len(elemB)-1
for i in range(len(elemA)):
if i > maxElemB:
elemB.append("0")
else:
maxElemA = len(elemA)-1
for i in range(len(elemB)):
if i > maxElemA:
elemA.append("0")
for i in range(len(elemB)):
if i > maxElemA:
elemA.append("0")
for i in range(len(elemB)):
lenA = len(elemA[i])
lenB = len(elemB[i])
if lenA == lenB:
pass
elif lenA > lenB:
res = lenA - lenB
for z in range(res):
elemB[i] = "0" + elemB[i]
elif lenB > lenA:
res = lenB - lenA
for z in range(res):
elemA[i] = "0" + elemA[i]
lenA = len(elemA[i])
lenB = len(elemB[i])
if lenA == lenB:
pass
elif lenA > lenB:
res = lenA - lenB
for z in range(res):
elemB[i] = "0" + elemB[i]
elif lenB > lenA:
res = lenB - lenA
for z in range(res):
elemA[i] = "0" + elemA[i]
#Version, letters, suffix, suffixVersion, rVersion
vA, lA, sA, svA, rvA = self._splitVersion(verA)
vB, lB, sB, svB, rvB = self._splitVersion(verB)
elemA = vA.split(".")
elemB = vB.split(".")
fillZero(elemA, elemB)
if lA or lB:
lA, lB = map(lambda x: x if x else '0', (lA, lB))
elemA.append(lA)
elemB.append(lB)
if sA or sB:
svA, svB = map(lambda x: [x] if x else ['0'], (svA, svB))
fillZero(svA, svB)
sA, sB = map(lambda x: x if x else 'p', (sA, sB))
elemA.append(str(self._lenSuffixDict + self._suffixDict[sA]))
elemA += svA
elemB.append(str(self._lenSuffixDict + self._suffixDict[sB]))
elemB += svB
if rvA or rvB:
rvA, rvB = map(lambda x: [x[1:]], (rvA, rvB))
fillZero(rvA, rvB)
elemA += rvA
elemB += rvB
return (".".join(elemA), ".".join(elemB))
@ -104,7 +177,8 @@ class _terms(_error, _shareTermsFunction):
"""
rpl = lambda x: x.replace("@@"," ")
trm = {"&&":"@@and@@","||":"@@or@@"}
rule = ["==", "!=", ">=", "<=", ">", "<"]
dictRuleFunc = {"==":eq, "!=":ne, ">=":ge, "<=":le, ">":gt, "<":lt}
rule = dictRuleFunc.keys()
listEqual = []
for k in trm.keys():
if k in term:
@ -174,10 +248,10 @@ class _terms(_error, _shareTermsFunction):
flagIntTypeVar = False
else:
if valVars == "" and\
not self._re_not_Version.search(vals[1]):
not self._notVersion(vals[1]):
valVars = "0"
elif vals[1] == "" and\
not self._re_not_Version.search(valVars):
not self._notVersion(valVars):
vals[1] = "0"
else:
try:
@ -193,15 +267,15 @@ class _terms(_error, _shareTermsFunction):
if flagFunction and flagNotEmptyVals and\
searchFunct.group(1) == "ini":
# Проверка значения на версию
if not self._re_not_Version.search(valVars) and\
not self._re_not_Version.search(vals[1]):
if not self._notVersion(valVars) and\
not self._notVersion(vals[1]):
verFile, verVar = self._convertVers(vals[1],valVars)
exec(\
"res=("+"'"+verVar+"'"+sepF+"'"+verFile+"'"+")")
res = dictRuleFunc[sepF](verVar,verFile)
if res:
listEqual.append(True)
else:
listEqual.append(False)
break
flagNotIniFunct = False
# Cравниваем номера версий
if flagNotIniFunct:
@ -211,25 +285,25 @@ class _terms(_error, _shareTermsFunction):
(flagFunction and searchFunct.group(1)=="load" and\
re.search("\(\s*ver\s*,",vals[0]))):
# Проверка значения на версию
if self._re_not_Version.search(vals[1]):
if self._notVersion(vals[1]):
self.setError("'%s'"%rpl(term)+" "+\
_("incorrect"))
self.setError(_("Value is not version"))
return False
# Проверка значения функции на версию
if self._re_not_Version.search(valVars):
if self._notVersion(valVars):
self.setError("'%s'"%rpl(term)+" "+\
_("incorrect"))
self.setError(\
_("Value function is not version"))
return False
verFile, verVar = self._convertVers(vals[1],valVars)
exec(\
"res=("+"'"+verVar+"'"+sepF+"'"+verFile+"'"+")")
res = dictRuleFunc[sepF](verVar,verFile)
if res:
listEqual.append(True)
else:
listEqual.append(False)
break
flagNotIniFunct = False
else:
if flagIntTypeVar is None:
@ -249,26 +323,28 @@ class _terms(_error, _shareTermsFunction):
self.setError(textError)
return False
valVar = valVars
exec("res=(%d%s%d)"%(valVar,sepF,valFile))
res = dictRuleFunc[sepF](valVar, valFile)
if res:
listEqual.append(True)
else:
listEqual.append(False)
break
else:
if sepF == "!=" or sepF == "==":
if not vals[1].strip():
vals[1] = ""
valFile = vals[1]
valVar = valVars
exec("res=("+'"""'+valVar+'"""'+sepF+"'"+\
valFile + "'"+")")
res = dictRuleFunc[sepF](valVar, valFile)
if res:
listEqual.append(True)
else:
listEqual.append(False)
break
else:
if not flagNotEmptyVals:
listEqual.append(False)
break
else:
self.setError("'%s'"%rpl(term) + " "\
+ _("incorrect"))
@ -278,6 +354,7 @@ class _terms(_error, _shareTermsFunction):
if t == "and":
if listEqual == [] or False in listEqual:
listEqual = [False]
break
else:
listEqual = [True]
else:
@ -2263,7 +2340,9 @@ class templateFunction(_error, _shareTemplate, _shareTermsFunction):
stackGlobalVars = []
# регулярное выражение для поиска версии
reFindVer = re.compile("(?<=\-)\d+\.?\d*\.?\d*")
reFindVer = re.compile("(?<=-)(?:\d+)(?:(?:\.\d+)*)"
"(?:[a-z]?)(?:(?:_(?:pre|p|beta|alpha|rc)\d*)*)"
"(?:-r\d+)?$")
# Имя обрабатываемого шаблона
nameTemplate = ""
@ -2533,7 +2612,7 @@ class templateFunction(_error, _shareTemplate, _shareTermsFunction):
tail = absNameFile.split(self.basePkgDir)
if len(tail)==2:
tail = tail[1].split('/')
if len(tail)==3 and tail[1]!='virtual':
if len(tail)==3 and tail[1]!='virtual':
pkgs.append(tail[2])
return True

Loading…
Cancel
Save