*************************************************************************** *!* Method: ProjMetrics *!* Purpose: Calc some simple project metrics *!* Author: bxk 11.11.03 *!* Parameters: *!* Returns: *!* Modifications: *************************************************************************** LPARAMETERS tcProjectName ASSERT !EMPTY(tcProjectName) .AND. VARTYPE(tcProjectName) = 'C' ; MESSAGE 'A project name is required' ASSERT EMPTY(JUSTEXT(tcProjectName)) .OR. UPPER(JUSTEXT(tcProjectName)) = 'PJX' ; MESSAGE 'A _PROJECT_ name is required' CLOS ALL CLOS DATA ALL SET CENTURY ON LOCAL lnClassCount, lnFormCount, lnLibCount, lnLineCount, lnRptCount, ; lnDBFCount, lnProgCount, lcOut, lnLines, lcProjName, lcFileName, lnViewCount, ; lnTableCount STORE 0 TO lnClassCount, lnFormCount, lnLibCount, lnLineCount, ; lnRptCount, lnDBFCount, lnProgCount, lnViewCount, lnTableCount STORE "" TO lcOut #DEFINE CRLF CHR(13) + CHR(10) IF ! ('.' $ tcProjectName) lcProjName = tcProjectName + '.PJX' ELSE lcProjName = tcProjectName ENDIF USE (lcProjName) in 0 ALIAS metProject SELECT metProject SCAN FOR !DELETED() lcType = ALLTRIM(metProject.type) && Handle project objects implemented as tables IF lcType $ 'M,V,K,R,d' lcObj = ALLTRIM(metProject.name) USE IN SELECT ('metObject') USE (lcObj) IN 0 AGAIN ALIAS metObject SELECT metObject DO CASE CASE lcType = 'M' && Menus SCAN FOR !EMPTY(metObject.procedure) lnLines = ALINES(laLines, metObject.procedure) lnLineCount = lnLineCount + GetLineCount(@laLines) ENDSCAN CASE lcType = 'V' && ClassLibs COUNT TO lnCount FOR !EMPTY(class) lnClassCount = lnClassCount + lnCount lnLibCount = lnLibCount + 1 SCAN FOR !EMPTY(methods) lnLines = ALINES(laLines, metObject.methods) lnLineCount = lnLineCount + GetLineCount(@laLines) ENDSCAN CASE lcType = 'K' && Forms lnFormCount = lnFormCount + 1 SCAN FOR !EMPTY(metObject.methods) lnLines = ALINES(laLines, metObject.methods) lnLineCount = lnLineCount + GetLineCount(@laLines) ENDSCAN CASE lcType = 'R' && Reports lnRptCount = lnRptCount + 1 SCAN FOR !EMPTY(metObject.expr) lnLines = ALINES(laLines, metObject.expr) lnLineCount = lnLineCount + GetLineCount(@laLines) ENDSCAN CASE lcType = 'd' SCAN FOR !DELETED() DO CASE CASE objecttype = 'View' lnViewCount = lnViewCount + 1 CASE objecttype = 'Table' lnTableCount = lnTableCount + 1 ENDCASE ENDSCAN ENDCASE ELSE IF lcType = 'D' && Tables lnDBFCount = lnDBFCount + 1 ELSE IF lcType = 'P' && Programs lnProgCount = lnProgCount + 1 lcProg = ALLTRIM(metProject.name) lcLines = FILETOSTR(lcProg) lnLines = ALINES(laLines, lcLines) lnLineCount = lnLineCount + GetLineCount(@laLines) ENDIF ENDIF ENDIF ENDSCAN lcOut = lcOut + CRLF + CRLF lcOut = lcOut + DTOC(DATE()) lcOut = lcOut + CRLF + CRLF lcOut = lcOut + + 'Project metrics for: ' + lcProjName + CRLF + CRLF lcOut = lcOut + 'Class Count = ' + TRAN(lnClassCount) + CRLF lcOut = lcOut + 'Lib Count = ' + TRAN(lnLibCount) + CRLF lcOut = lcOut + 'Form Count = ' + TRAN(lnFormCount) + CRLF lcOut = lcOut + 'Line Count = ' + TRAN(lnLineCount) + CRLF lcOut = lcOut + 'Report Count = ' + TRAN(lnRptCount) + CRLF lcOut = lcOut + 'Lookup Count = ' + TRAN(lnDBFCount) + CRLF lcOut = lcOut + 'Program Count = ' + TRAN(lnProgCount) + CRLF lcOut = lcOut + 'Data Table Count = ' + TRAN(lnTableCount) + CRLF lcOut = lcOut + 'Data View Count = ' + TRAN(lnViewCount) + CRLF lcFileName = JUSTSTEM(lcProjName) + 'Metrics.txt' StrToFile(lcOut, lcFileName) MESSAGEBOX(lcFileName + ' Created') CLOS DATA ALL RETURN *************************************************************************** *!* Method: GetLineCount *!* Purpose: Returns lines of code in a Method, Prg. Ignore comments *!* white space. *!* Author: bxk *!* Parameters: *!* Returns: *!* Modifications: *************************************************************************** FUNCTION GetLineCount LPARAMETERS taLines LOCAL lnCount, lnLines STORE 0 TO lnCount, lnLines lnLines = ALEN(taLines) FOR li = 1 TO lnLines IF EMPTY(taLines[li]) .OR. LEFT(ALLTRIM(taLines[li]), 1) $ '&*' ELSE lnCount = lnCount + 1 ENDIF ENDFOR RETURN lnCount