18 from Tool.tool
import getParameter,removeParameter,getFileName,resolvePythonExecutable
84 s+=f
"posChange:{self.pos}, "
86 s+=f
"typeChange:{self.type}, "
88 s+=f
"delete:{self.dele}, "
90 s+=f
"add:{self.add}, "
102 with open(errorLog,
'a', encoding=
'utf-8')
as fw:
118 ansDict[
'current']=sharedDict[k][
'current']
119 ansDict[
'target']=sharedDict[k][
'target']
134 if key
not in sharedDict:
136 innerDict=sharedDict[key]
137 innerDict[
'current']=currentDict
138 innerDict[
'target']=targetDict
139 sharedDict[key]=innerDict
141 innerDict=sharedDict[key]
142 if sharedDict[key][
'current'][
'matchMethod']==
'static' and currentDict[
'matchMethod']==
'dynamic':
143 innerDict[
'current']=currentDict
144 if sharedDict[key][
'target'][
'matchMethod']==
'static' and targetDict[
'matchMethod']==
'dynamic':
145 innerDict[
'target']=targetDict
146 sharedDict[key]=innerDict
167 if oldType==
"" or newType==
"":
175 if oldType[0]==
"'" and oldType[-1]==
"'":
176 oldType=oldType[1:-1]
178 if newType[0]==
"'" and newType[-1]==
"'":
179 newType=newType[1:-1]
181 if 'Union' in oldType:
182 pattern=
r'.*?Union\[(.*)\].*?'
183 result=re.findall(pattern,oldType)
185 elif 'Optional' in oldType:
186 pattern=
r'.*?Optional\[(.*)\].*?'
187 result=re.findall(pattern,oldType)
190 oldLst=oldType.split(
'|')
195 oldTypeSet.add(it.replace(
' ',
''))
199 if 'Union' in newType:
200 pattern=
r'.*?Union\[(.*)\].*?'
201 result=re.findall(pattern,newType)
203 elif 'Optional' in newType:
204 pattern=
r'.*?Optional\[(.*)\].*?'
205 result=re.findall(pattern,newType)
208 newLst=newType.split(
'|')
213 newTypeSet.add(it.replace(
' ',
''))
216 if len(oldTypeSet)>0
and oldTypeSet.issubset(newTypeSet):
229 paraStr=paraStr.replace(
' ',
'')
232 paraStr=paraStr.split(
'->')[0]
233 if '(' in paraStr[0]:
234 paraStr=paraStr[1:-1]
240 lst=[para
for para
in lst
if para !=
'/']
244 elif 'cls' in lst[0]:
247 parameter=Parameter()
248 parameter.position=lst.index(para)
249 parameter.fullItem=para
255 if flagMaohao
and "'" not in para[0:pos]
and '"' not in para[0:pos]
and '<' not in para[0:pos]:
261 parameter.value=ll[1]
270 paraObjLst.append(parameter)
275 for para
in paraObjLst:
276 if '**' in para.name:
277 pos2Star=para.position
278 elif '*' in para.name:
279 posStar=para.position
286 posParameters=paraObjLst[0:pos]
288 for para
in paraObjLst[pos+1:]:
289 if '**' not in para.name:
290 keyParameters.append(para)
292 return posParameters,keyParameters
305 oldPosParaNum=len(oldPos)
309 for oldPara
in copy.deepcopy(oldPos):
311 for newPara
in newPos:
312 if oldPara.name==newPara.name:
314 if oldPara.position!=newPara.position:
315 up.pos=newPara.position
320 oldPos.remove(oldPara)
321 newPos.remove(newPara)
324 dic[(oldPara.name,oldPara.position)]=up
327 for oldPara
in copy.deepcopy(oldKey):
329 for newPara
in newKey:
330 if oldPara.name==newPara.name:
336 oldKey.remove(oldPara)
337 newKey.remove(newPara)
340 dic[(oldPara.name,oldPara.position)]=up
345 for oldPara
in copy.deepcopy(oldPos):
347 for newPara
in newKey:
348 if oldPara.name==newPara.name:
350 up.pos2key=oldPara.name
355 oldPos.remove(oldPara)
356 newKey.remove(newPara)
359 dic[(oldPara.name,oldPara.position)]=up
363 for oldPara
in copy.deepcopy(oldKey):
365 for newPara
in copy.deepcopy(newPos):
366 if oldPara.name==newPara.name:
367 print(f
"key2pos-->{oldPara.name}")
369 up.key2pos=oldPara.name
374 oldKey.remove(oldPara)
375 newPos.remove(newPara)
378 dic[(oldPara.name,oldPara.position)]=up
384 for oldPara
in copy.deepcopy(oldPos):
386 for newPara
in newPos:
387 if oldPara.position==newPara.position
and not isDifferType(oldPara.type,newPara.type):
389 if oldPara.name!=newPara.name:
390 up.rename=newPara.name
395 oldPos.remove(oldPara)
396 newPos.remove(newPara)
399 dic[(oldPara.name,oldPara.position)]=up
401 oldPos.remove(oldPara)
404 dic[(oldPara.name,oldPara.position)]=up
407 for oldPara
in copy.deepcopy(oldKey):
409 for newPara
in newKey:
410 if oldPara.type==newPara.type:
413 up.rename=newPara.name
414 oldKey.remove(oldPara)
415 newKey.remove(newPara)
418 dic[(oldPara.name,oldPara.position)]=up
420 oldKey.remove(oldPara)
423 dic[(oldPara.name,oldPara.position)]=up
431 if para.position>=0
and para.position<oldPosParaNum:
433 if key[1]==para.position:
439 dic[(para.name,para.position)]=up
448 dic[(para.name,para.position)]=up
453 for key,value
in dic.items():
454 if key
not in updateDict:
457 updateDict[key][
'delete']=value.dele
459 updateDict[key][
'typeChange']=value.type
461 updateDict[key][
'rename']=value.rename
463 updateDict[key][
'posChange']=value.pos
465 updateDict[key][
'replace']=value.rep
467 updateDict[key][
'pos2key']=value.pos2key
469 updateDict[key][
'addPos']=value.addPos
471 updateDict[key][
'addKey']=value.addKey
474 updateDict[key][
'key2pos']=value.key2pos
477 ansDict=dict(sorted(updateDict.items(), key=
lambda it: it[0][1]))
498 for oldPara
in oldPos:
500 for newPara
in newPos:
501 if oldPara.name==newPara.name
and oldPara.position==newPara.position
and not isDifferType(oldPara.type,newPara.type):
508 for newPara
in newPos:
509 if newPara.position>=len(oldPos):
510 if newPara.value==
'':
514 for oldPara
in oldKey:
516 for newPara
in newKey:
517 if oldPara.name==newPara.name
and not isDifferType(oldPara.type,newPara.type):
523 for newPara
in newPos:
524 if oldPara.name==newPara.name
and not isDifferType(oldPara.type,newPara.type):
526 print(f
"key2pos-->{oldPara.name}")
534 for newPara
in newKey:
536 for oldPara
in oldKey:
537 if newPara.name==oldPara.name:
541 if newPara.value==
'':
557 if len(current[
'match'])==0
or len(target[
'match'])==0:
562 if isinstance(current[
'match'],str):
563 currentDict={current[
'internalPath']:[current[
'match']]}
565 currentDict=current[
'match']
567 if isinstance(target[
'match'],str):
568 targetDict={target[
'internalPath']:[target[
'match']]}
570 targetDict=target[
'match']
575 for currentSameAPI,currentOvLst
in currentDict.items():
576 for targetSameAPI,targetOvLst
in targetDict.items():
577 if currentSameAPI==targetSameAPI
or (currentSameAPI+
'.' in targetSameAPI)
or (targetSameAPI+
'.' in currentSameAPI)
or len(currentDict)==1
and len(targetDict)==1:
582 for currentOvPara
in copy.deepcopy(currentOvLst):
583 for targetOvPara
in copy.deepcopy(targetOvLst):
584 if currentOvPara.split(
'->')[0]==targetOvPara.split(
'->')[0]:
585 currentOvLst.remove(currentOvPara)
586 targetOvLst.remove(targetOvPara)
591 for currentOvPara
in currentOvLst:
593 for targetOvPara
in targetOvLst:
598 if compatibleFlag==0:
599 for targetOvPara
in targetOvLst:
600 repairDict=
findDiffer(currentOvPara,targetOvPara)
601 tempLst1.append((repairDict,targetOvPara))
604 for currentOvPara
in currentOvLst:
606 for targetOvPara
in targetOvLst:
611 if compatibleFlag==0:
612 for targetOvPara
in targetOvLst:
613 repairDict=
findDiffer(currentOvPara,targetOvPara)
614 tempLst2.append((repairDict,targetOvPara))
636 def addValueForAPI(callAPI,projName,runPath,runCommand,currentEnv,targetEnv,errLst,callKey,*,runtimePaths):
637 copyRoot=runtimePaths[
'copy_root']
638 dynamicRoot=runtimePaths[
'dynamic_root']
644 (
'new_'+pklName[:-4]+
'__object.pkl',1),
645 (
'new_'+pklName[:-4]+
'__expr.pkl',1),
647 (pklName[:-4]+
'__object.pkl',0),
648 (pklName[:-4]+
'__expr.pkl',0),
652 for candidateName,candidateFlag
in pklCandidates:
653 candidatePath=os.path.join(copyRoot,
'pkl',candidateName)
654 if os.path.exists(candidatePath):
656 pklPath=candidatePath
669 if runPath
and runPath
not in runCommand:
670 cwd = os.path.join(dynamicRoot, projName, runPath)
671 script =
'addValueForAPI.py'
673 cwd = os.path.join(dynamicRoot, projName)
674 script = os.path.join(runPath,
'addValueForAPI.py')
676 cwd = os.path.join(dynamicRoot, projName)
677 script =
'addValueForAPI.py'
678 matchResult = subprocess.run(
679 [pythonPath, script, pklPath, callAPI, pklKey],
680 cwd=cwd, capture_output=
True, text=
True, encoding=
'utf-8'
682 if matchResult.returncode!=0:
683 errLst.append(f
"{callAPI}, addValueError: {matchResult.stderr}\n")
686 output=matchResult.stdout
688 obj=re.compile(pattern,re.DOTALL)
689 lst=obj.findall(output)
Update class for parameter change analysis 参数变更分析类
pos2key
Conversion of positional parameter to keyword parameter 位置参数变更为关键字参数
rename
New name of the parameter 参数重命名
dele
Flag (1) of parameter deletion 参数删除标记 (1)
addPos
New positional parameter 新增位置参数
key2pos
Conversion of keyword parameter to positional parameter 关键字参数变更为位置参数
addKey
New keyword parameter 新增关键字参数
type
New type of the parameter 参数新类型
def __repr__(self)
Return the string representation of the parameter update 返回参数变更的字符串表示形式
rep
Replacement of the parameter 参数替换
pos
New position of the parameter 参数新位置
def __init__(self)
The constructor 构造函数
value
New default value of the parameter 参数新默认值
def analyzeCompatibility(oldPara, newPara)
Analyze the compatibility of two APIs 判断两个重载API是否兼容
def isCompatible(current, target)
Determine the compatibility of APIs from current and target versions 判断起始版本和目标版本API的兼容性
def updateErrorLst(errorLog, errorLst)
Save error messages 保存错误信息
def para2Obj(paraStr)
Convert parameter string to positional and keyword parameter objects 将参数字符串转换为位置和关键字参数对象
def isDifferType(oldType, newType)
Determine parameter type change: compatible type means no type change 判断两个参数的类型是否发生了变更: 只要兼容,就认为相同
def updateSharedDict(callAPI, currentDict, targetDict, sharedDict)
Update API mapping dictionary: add and revise 更新API映射字典: 添加和修改
def findDiffer(oldPara, newPara)
Determine difference of two parameters 输入两个api参数部分,判断参数部分有何不同
def querySharedDict(callAPI, sharedDict)
Query API mapping dictionary 查询API映射字典
def addValueForAPI(callAPI, projName, runPath, runCommand, currentEnv, targetEnv, errLst, callKey, *runtimePaths)
Add values stored by pkl file for API parameters 为API参数添加保存至pkl文件中的值