# -*- coding: GBK -*-
|
#write:zfl
|
#
|
##@package ReportAnalyzer.py
|
# Ä£¿éµÄ¼òҪ˵Ã÷:½âÎö´úÂëÖ´ÐÐÂʱ¨¸æ
|
# @author:zfl
|
# @date 2010-11-03 10:00
|
# @version 1.0
|
#
|
# ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ
|
#
|
# Ä£¿éÏêϸ˵Ã÷:½âÎö´úÂëÖ´ÐÐÂʱ¨¸æ
|
#
|
#-------------------------------------------------------------------------------
|
|
"""Version = 2010-11-03 10:00"""
|
|
#-------------------------------------------------------------------------------
|
#µ¼Èë
|
import os
|
import time
|
import traceback
|
import PyTrackObj
|
|
#-------------------------------------------------------------------------------
|
#È«¾Ö±äÁ¿
|
|
FORM_NAME = "ReportAnalyzer"
|
|
#---µ÷ÊÔº¯Êý--------------------------------------------------------------------
|
|
NOW_TIME = 'log%s%s%s%s%s%s.txt'%tuple(['%02d'%time.localtime()[i] for i in range(6)])
|
|
LOG_PATH = os.getcwd() + "\\log\\" # log·¾¶
|
|
FileEndStr = "_Report.txt"
|
FileNameConnector = "!"
|
ReportConnector = "_"
|
ReportMDVConnector = "²âÊÔ±¨¸æMD5"
|
PyMDVConnector = "PyÎļþMD5"
|
|
## дlogº¯Êý
|
# @param *varlist ²»¶¨²Î
|
# @return ÎÞ·µ»ØÖµ
|
# @remarks ½«´«ÈëµÄlogÐÅϢдÈëÖ¸¶¨logÎļþ
|
def LogEx(*varlist):
|
info = '[%s%s%s%s%s%s]'%tuple(['%02d'%time.localtime()[i] for i in range(6)])
|
for i in range(1, len(varlist)):
|
curValue = varlist[i]
|
info += "( "+str(type(curValue)) + ":" + str(curValue) + " ),"
|
|
if not os.path.isdir(LOG_PATH):
|
os.mkdir(LOG_PATH)
|
|
if os.path.isfile(LOG_PATH + NOW_TIME):
|
logfile = open(LOG_PATH + NOW_TIME, 'a')
|
else:
|
logfile = file(LOG_PATH + NOW_TIME, 'w')
|
|
logfile.write('\t'*int(varlist[0])+info+'\n')
|
logfile.close()
|
|
LogEx(0, "CurPath=%s"%os.getcwd())
|
|
|
## »ñµÃkey¶ÔÓ¦µÄÊý¾Ý
|
# @param keyList: ¹Ø¼ü´ÊÁбí
|
# @param line: Ò»Ðб¨¸æÄÚÈÝ
|
# @return ·µ»Økey¶ÔÓ¦µÄÊý¾ÝÁбí
|
# @remarks »ñµÃkey¶ÔÓ¦µÄÊý¾Ý
|
def GetValueByKey(keyList, line):
|
|
valueList = []
|
for key in keyList:
|
keyPos = line.find(key)
|
# ÕÒ²»µ½Ê±£¬¼ÓÈë¿Õ´®
|
if keyPos == -1:
|
valueList.append("")
|
LogEx(0, "key = %s: Key Erorr!"%key)
|
continue
|
|
line = line[keyPos:]
|
#½âÎö³öÊý¾Ý£¬¼ÓÈëÁбí
|
valueList.append(line[line.find("[")+1:line.find("]")])
|
|
return valueList
|
|
|
## ¸²¸ÇÂʱ¨¸æ½âÎöÆ÷
|
# @param fileName: ±¨¸æÎļþÃû
|
# @param MD5Key: MD5ÃÜÔ¿
|
# @param contentList: ±¨¸æÄÚÈÝ
|
# @return ·µ»ØPyObj
|
# @remarks ¸²¸ÇÂʱ¨¸æ½âÎöÆ÷
|
def ReportAnalyzer(fileName, contentList, MD5Key):
|
|
# ÎļþÃû³ö´í
|
if not fileName.endswith(FileEndStr):
|
# ×ܱ¨¸æ£¬²»½âÎö
|
if not fileName.find(".py") and not fileName.find(".PY"):
|
return
|
LogEx(0, "fileName = %s: FileName Erorr!"%fileName)
|
return
|
|
# È¥µô·¾¶Ç°×º
|
tName = fileName[fileName.rfind("\\")+1:]
|
# ½âÎöPyÃû
|
connectPos = tName.find(FileNameConnector)
|
if connectPos == -1:
|
connectPos = tName.rfind(ReportConnector)
|
pyName = tName[:connectPos] # pyÃû
|
|
state = GetValueByKey(["state"], contentList[0])[0]
|
|
# ³õʼ»¯
|
pyObj = PyTrackObj.GetPyObj(pyName, MD5Key, "", False)
|
funcObjList = [] # º¯Êý¶ÔÏóÁбí
|
pyCodeList = [] # PyÄÚÈÝÁбí
|
|
pyExecCount = int(state[:state.find("/")]) # pyÒÑÖ´ÐÐÐÐÊý
|
pyTotalCount = int(state[state.find("/")+1:]) # py×ÜÓÐЧÐÐÊý
|
|
# funcObj = None # º¯Êý¶ÔÏó
|
className = "" # ËùÊôÀàÃû
|
funcName = "" # º¯ÊýÃû
|
funcComment = "" # º¯Êý×¢ÊÍ
|
# execRowCount = 0 # ÒÑÖ´ÐÐÐÐÊý
|
# totalRowCount = 0 # ×ÜÐÐÊý
|
startIndex = 0 # º¯ÊýÆðʼ
|
endIndex = 0 # º¯Êý½áÊø
|
returnValue = None # ·µ»ØÖµ
|
funcMD5 = "" # º¯ÊýMD5
|
reportMD5 = "" # PyÎļþMD5
|
rowInfoList = [] # ÐжÔÏóÁбí
|
|
iCount = 0 # ÌøÐмÆÊý
|
|
# if 1:
|
try:
|
for i in range(1, len(contentList)):
|
# print contentList[i]
|
# È¥µô¶àÓڵĻ»ÐÐ
|
contentList[i] = contentList[i][:-1]
|
line = contentList[i]
|
|
# Ìø¹ýPyÎļþµÄMD5
|
if line.startswith(PyMDVConnector):
|
pyMD5 = GetValueByKey(["MD5"], line)[0]
|
continue
|
|
# ±¨¸æ½áÊø
|
if line.startswith(ReportMDVConnector):
|
# ÒѾ»ñµÃº¯ÊýÐÅÏ¢
|
if funcName:
|
# ÉèÖÃFuncObjÐÅÏ¢
|
funcObj = PyTrackObj.GetFuncObj(className, funcName, funcComment, rowInfoList, \
|
startIndex, endIndex, funcMD5, returnValue)
|
# ¼ÓÈ뺯Êý¶ÔÏóÁбí
|
funcObjList.append(funcObj)
|
# È¥µôÊ×ÐеĻ»Ðзû
|
contentList[0] = contentList[0][:-1]
|
|
reportMD5 = GetValueByKey(["MD5"], line)[0]
|
|
# ÑéÖ¤PyÎļþµÄMD5
|
if reportMD5 != PyTrackObj.CalcListMD5(contentList[:i-1], MD5Key):
|
LogEx(0, "fileName = %s: MD5 Erorr!"%fileName)
|
# print "fileName = %s: MD5 Erorr!"%fileName
|
return None
|
|
# print "fileName = %s: PyMD5 OK!"%fileName
|
|
# ÉèÖÃPyObjÐÅÏ¢
|
pyObj.SetPyInfo(pyName, pyExecCount, pyTotalCount, funcObjList, pyCodeList, pyMD5)
|
else:
|
LogEx(0, "fileName = %s: No Code!"%fileName)
|
break
|
|
# ÅжÏÊÇ·ñÊǺ¯ÊýÍ·
|
if line.find("]:"+" <") != -1 or line.find("]:"+":<") != -1:
|
|
# ÒѾ»ñµÃº¯ÊýÐÅÏ¢
|
if funcName:
|
|
# ÉèÖÃFuncObjÐÅÏ¢
|
funcObj = PyTrackObj.GetFuncObj(className, funcName, funcComment, rowInfoList, \
|
startIndex, endIndex, funcMD5, returnValue)
|
# ¼ÓÈ뺯Êý¶ÔÏóÁбí
|
funcObjList.append(funcObj)
|
|
funcObj = None
|
rowInfoList = []
|
|
# ÅжÏÓÐûÓÐÀàÃû
|
if line.find("]:"+":<") != -1:
|
className = line[line.find("[") + 1:line.find("]")]
|
else:
|
className = "" # ËùÊôÀàÃû
|
|
#---»ñµÃº¯ÊýÐÅÏ¢---
|
funcName = line[line.find("<") + 1:line.find(">")]
|
funcMD5Pos = contentList[i - 1].find("MD5:[")
|
funcMD5Pos = (funcMD5Pos == -1) and len(contentList[i - 1]) or funcMD5Pos
|
funcMD5 = GetValueByKey(["MD5"], contentList[i - 1])[0]
|
funcComment = contentList[i - 1][:funcMD5Pos - 4]
|
|
# returnValue×Ö·û´®£¬²»È«ÔÚ±¾ÐÐÄÚ
|
if contentList[i].find("type") == -1:
|
# returnValue×Ö·û´®Öв¹»»Ðзû
|
contentList[i] += "\n"
|
line = contentList[i]
|
|
# returnValueÖÐÓÐÐл»·û£¬½«returnValueËùÓÐÐÐÄÚÈÝ×éºÏÆðÀ´
|
for j in range(i+1, len(contentList)):
|
if line.find("] "+"type"+":[") != -1:
|
break
|
|
line += contentList[j]
|
iCount += 1
|
|
# ½âÎöº¯ÊýÐÅÏ¢
|
valueList = GetValueByKey(["state", "range", "returnValue", "type"], line)
|
|
execRowCount = int(valueList[0][:valueList[0].find("/")])
|
totalRowCount = int(valueList[0][valueList[0].find("/")+1:])
|
startIndex = int(valueList[1][:valueList[1].find(":")])
|
endIndex = int(valueList[1][valueList[1].find(":")+1:])
|
returnValueType = valueList[3][valueList[3].find("'")+1:valueList[3].rfind("'")]
|
|
if returnValueType == "str":
|
returnValue = valueList[2]
|
elif returnValueType == "NoneType":
|
returnValue = None
|
else:
|
returnValue = eval("%s('''%s''')"%(returnValueType, valueList[2]))
|
continue
|
|
# Ìø¹ý±»·Ö¸îµÄreturnValue×Ö·û´®
|
if iCount > 0:
|
if iCount > 1:
|
# ¶ÔreturnValue×Ö·û´®²¹»»Ðзû
|
contentList[i] = contentList[i] + "\n"
|
iCount -= 1
|
continue
|
|
# Èç¹û·Ç¿ÕÐлòº¯Êý×¢ÊÍ
|
if len(line.strip()) > 0 and not line.strip().startswith("##") and not line.strip().startswith("MD5"):
|
rowIndex = int(line[line.find("[")+1:line.find("]")])
|
|
# ÅжÏÊÇ·ñÖ´Ðйý
|
if line.startswith("*"):
|
rowState = 0
|
else:
|
rowState = 1
|
|
line = line[line.find("]")+2:]
|
|
# ²¹×ãÐÐÊý
|
for j in range(len(pyCodeList), rowIndex-1):
|
pyCodeList.append("\n")
|
pyCodeList.append(line + "\n")
|
|
offset = rowIndex - startIndex
|
|
# ×¢ÊͺͿɺöÂÔ´úÂ룬²»¼Ç¼ִÐÐÇé¿ö
|
if line.strip().startswith("#") or PyTrackObj.IsLineNeedIgnore(line):
|
rowInfoList.append([rowIndex, offset, 2, contentList[i][contentList[i].find("]")+2:]])
|
continue
|
|
rowInfoList.append([rowIndex, offset, rowState, contentList[i][contentList[i].find("]")+2:]])
|
|
except:
|
LogEx(0, "Error--%s"%traceback.format_exc())
|
return None
|
|
# print pyObj.GetTestReport("", 1, 1)
|
|
return pyObj
|
|
|
#-------------------------------------------------------------------------------
|