def detectUnnAbsInDefine(fileObj, outputFile):
    defineList = fileObj.getDefineDeclarationList()
    for aDefine in defineList:
        lineCount, textSizeCount = aDefine.getBodyTextSize()
        if lineCount < CONSTS.LOC_THRESHOLD_UNNABS and textSizeCount < CONSTS.SIZE_THRESHOLD_UNNABS:
            Utilities.reportSmell(outputFile, fileObj.fileName,
                                  CONSTS.SMELL_UNN_ABS, CONSTS.DEFINE_RES)
def detectTCMod(fileObj, outputFile):
    if not (fileObj.fileName.__contains__("param")
            or fileObj.fileName.__contains__("init")
            or fileObj.fileName.__contains__("site")):
        if len(fileObj.getHardCodedStatments()) > 1:
            Utilities.reportSmell(outputFile, fileObj.fileName,
                                  CONSTS.SMELL_TC_MOD, CONSTS.FILE_RES)
예제 #3
0
def detectMulAbsInClass(fileObj, outputFile):
    classList = fileObj.getClassDeclarationList()
    for aClass in classList:
        lcom = aClass.getLCOM()
        if lcom < CONSTS.LCOM_THRESHOLD:
            Utilities.reportSmell(outputFile, fileObj.fileName,
                                  CONSTS.SMELL_MUL_ABS_2, CONSTS.CLASS_RES)
def analyze(folder, file):
    resultsMetrics = defaultdict(list)  # erasing for the next file

    outputFile = open(folder + "/" + CONSTS.PUPPETEER_OUT_FILE, 'a+')
    print("folder: ", folder)
    print("file: ", file)

    puppetFileCount = FileOperations.countPuppetFiles(file)
    # print("puppetFileCount: ", puppetFileCount)
    resultsMetrics[file].append(puppetFileCount)

    outputFile.write(CONSTS.PUPPET_FILE_COUNT + str(puppetFileCount) + "\n")
    Utilities.myPrint(CONSTS.PUPPET_FILE_COUNT + str(puppetFileCount))

    metricsResults = SizeMetrics.collectSizeMetrics(file, outputFile)

    for i in metricsResults:
        resultsMetrics[file].append(i)

    # puppetFileCount, totalClasses,totalDefines,totalFiles,totalPackages,totalServices,totalExecs,totalLOC
    # print("RESULTS: ", resultsMetrics)

    CONSTS.smellsResults = {}  # erasing for the next file
    SmellDectector.detectSmells(file, outputFile)

    # print("CONSTS.smellsResults: ", CONSTS.smellsResults)
    # print("\n\n")

    outputFile.close()
    return resultsMetrics, CONSTS.smellsResults
예제 #5
0
def detectMisAbs(fileObj, outputFile):
    classAndDefineCount = len(fileObj.getOuterClassList() +
                              fileObj.getOuterDefineList())
    outerElementCount = len(fileObj.getOuterElementList())
    if outerElementCount - classAndDefineCount > CONSTS.MISABS_MAX_NON_ABS_COUNT:
        Utilities.reportSmell(outputFile, fileObj.fileName,
                              CONSTS.SMELL_MIS_ABS, CONSTS.FILE_RES)
예제 #6
0
def detectMissingModules(folder, outputFile):
    #print("%s" % (inspect.stack()[0][3]))
    classNamesSet = set()
    includeClassSet = set()
    for abspath, dirs, files in os.walk(folder):
        for file in files:
            #print(file)
            if file.endswith(".pp") and not os.path.islink(os.path.join(abspath, file)):
                #print(file)
                fileObj = SourceModel.SM_File.SM_File(os.path.join(abspath, file))
                classNames, fileIncludes = detectMissingClassesByInclude(fileObj, outputFile)
                #print("Classes: %s" % ','.join(n for n in classNames))
                classNamesSet = classNamesSet.union(classNames)
                #print("Union with %s: %s" % (','.join(n for n in classNames), ','.join(n for n in classNamesSet)))
                includeClassSet = includeClassSet.union(fileIncludes)
    #print("%s: Classes: %s" % (inspect.stack()[0][3], ','.join(n for n in classNamesSet)))
    #print("%s: Class includes: %s" % (inspect.stack()[0][3], ','.join(i for i in includeClassSet)))
    missingDependencySet = includeClassSet.difference(classNamesSet)
    #print(includeClassSet)
    #print(classNamesSet)
    #print(missingDependencySet)
    Utilities.myPrint("Missing dependency set: %s" % ','.join(c for c in missingDependencySet))
    #for md in missingDependencySet:
        #Utilities.reportSmell(outputFile, folder, CONSTS.SMELL_MIS_DEP, CONSTS.FILE_RES)
    with open('missDependencies.puppeteer.txt', 'a+') as f:
        for md in missingDependencySet:
            f.write("%s\n" % md)
            Utilities.reportSmell(outputFile, folder, CONSTS.SMELL_MIS_DEP, CONSTS.FILE_RES)
예제 #7
0
def detectBroHierarchy(folder, outputFile):
    classNames, superClassNames = collectClassNames(folder)
    #print("classNames: " + str(classNames))
    #print("superClassNames: " + str(superClassNames))
    for superClass in superClassNames:
        if not classNames.__contains__(superClass):
            Utilities.reportSmell(outputFile, folder, CONSTS.SMELL_BRO_HIE, CONSTS.MODULE_RES)
def detectUnnAbsInClasses(fileObj, outputFile):
    classList = fileObj.getClassDeclarationList()
    for aClass in classList:
        lineCount, textSizeCount = aClass.getBodyTextSize()
        if lineCount < CONSTS.LOC_THRESHOLD_UNNABS and textSizeCount < CONSTS.SIZE_THRESHOLD_UNNABS:
            Utilities.reportSmell(outputFile, fileObj.fileName,
                                  CONSTS.SMELL_UNN_ABS, CONSTS.CLASS_RES)
예제 #9
0
def detectBroHierarchy(folder, outputFile):
    classNames, superClassNames = collectClassNames(folder)
    #print("classNames: " + str(classNames))
    #print("superClassNames: " + str(superClassNames))
    for superClass in superClassNames:
        if not classNames.__contains__(superClass):
            Utilities.reportSmell(outputFile, folder, CONSTS.SMELL_BRO_HIE,
                                  CONSTS.MODULE_RES)
def detectImpAbs(fileObj, outputFile):
    execDecls = fileObj.getNoOfExecDeclarations()
    totalDeclarations = fileObj.getNoOfClassDeclarations() + fileObj.getNoOfDefineDeclarations() + \
                        fileObj.getNoOfFileDeclarations() + fileObj.getNoOfPackageDeclarations() + \
                        fileObj.getNoOfServiceDeclarations() + execDecls
    if float(totalDeclarations * CONSTS.IMPABS_THRESHOLD) <= float(
            execDecls) and execDecls > CONSTS.IMPABS_MAXEXECCOUNT:
        Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_IMP_ABS, CONSTS.FILE_RES)
예제 #11
0
def detectImpAbs(fileObj, outputFile):
    execDecls = fileObj.getNoOfExecDeclarations()
    totalDeclarations = fileObj.getNoOfClassDeclarations() + fileObj.getNoOfDefineDeclarations() + \
                        fileObj.getNoOfFileDeclarations() + fileObj.getNoOfPackageDeclarations() + \
                        fileObj.getNoOfServiceDeclarations() + execDecls
    if float(totalDeclarations * CONSTS.IMPABS_THRESHOLD) <= float(
            execDecls) and execDecls > CONSTS.IMPABS_MAXEXECCOUNT:
        Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_IMP_ABS, CONSTS.FILE_RES)
예제 #12
0
def detectDuplicateAbs(folder, outputFile):
    cpdXmlFile = getCpdXmlFile(folder)
    if cpdXmlFile:
        file = open(os.path.join(folder, cpdXmlFile), 'r', errors='ignore')
        fileContent = file.read()
        compiledRE = re.compile("<duplication lines=")
        for i in re.findall(compiledRE, fileContent):
            Utilities.reportSmell(outputFile, folder, CONSTS.SMELL_DUP_ABS, CONSTS.FILE_RES)
def detectDuplicateAbs(folder, outputFile):
    cpdXmlFile = getCpdXmlFile(folder)
    if cpdXmlFile:
        file = open(os.path.join(folder, cpdXmlFile), 'r', errors='ignore')
        fileContent = file.read()
        compiledRE = re.compile("<duplication lines=")
        for i in re.findall(compiledRE, fileContent):
            Utilities.reportSmell(outputFile, folder, CONSTS.SMELL_DUP_ABS, CONSTS.FILE_RES)
예제 #14
0
 def getDefineDeclarationList(self):
     compiledRE = re.compile(SMCONSTS.DEFINE_REGEX)
     defineList = []
     for match in compiledRE.findall(self.fileText):
         defineText, s, e = self.extractElementText(match)
         Utilities.myPrint("Extracted define declaration: " + defineText)
         defineObj = SourceModel.SM_Define.SM_Define(defineText)
         defineList.append(defineObj)
     return defineList
예제 #15
0
 def getServiceResourceList(self):
     compiledRE = re.compile(SMCONSTS.SERVICE_REGEX)
     serviceResourceList = []
     for match in (compiledRE.findall(self.fileText)):
         serviceResourceText = self.extractResourceText(match)
         Utilities.myPrint("Extracted service declaration: " + serviceResourceText)
         serviceResourceObj = SourceModel.SM_ServiceResource.SM_ServiceResource(serviceResourceText)
         serviceResourceList.append(serviceResourceObj)
     return serviceResourceList
예제 #16
0
 def getPackageResourceList(self):
     compiledRE = re.compile(SMCONSTS.PACKAGE_REGEX)
     packageResourceList = []
     for match in (compiledRE.findall(self.fileText)):
         packageResourceText = self.extractResourceText(match)
         Utilities.myPrint("Extracted package declaration: " + packageResourceText)
         packageResourceObj = SourceModel.SM_PackageResource.SM_PackageResource(packageResourceText)
         packageResourceList.append(packageResourceObj)
     return packageResourceList
예제 #17
0
 def getDefineDeclarationList(self):
     compiledRE = re.compile(SMCONSTS.DEFINE_REGEX)
     defineList = []
     for match in compiledRE.findall(self.fileText):
         defineText, s, e = self.extractElementText(match)
         Utilities.myPrint("Extracted define declaration: " + defineText)
         defineObj = SourceModel.SM_Define.SM_Define(defineText)
         defineList.append(defineObj)
     return defineList
예제 #18
0
 def getNodeDeclarations(self):
     compiledRE = re.compile(SMCONSTS.NODE_REGEX)
     nodeResourceList = []
     for match in (compiledRE.findall(self.fileText)):
         nodeResourceText = self.extractResourceText(match)
         Utilities.myPrint("Extracted node declaration: " + nodeResourceText)
         nodeResourceObj = SourceModel.SM_Node.SM_Node(nodeResourceText)
         nodeResourceList.append(nodeResourceObj)
     return nodeResourceList
예제 #19
0
 def getFileResourceList(self):
     compiledRE = re.compile(SMCONSTS.FILE_REGEX)
     fileResourceList = []
     for match in (compiledRE.findall(self.fileText)):
         fileResourceText = self.extractResourceText(match)
         Utilities.myPrint("Extracted file declaration: " + fileResourceText)
         fileResourceObj = SourceModel.SM_FileResource.SM_FileResource(fileResourceText)
         fileResourceList.append(fileResourceObj)
     return fileResourceList
예제 #20
0
def detectUnstructuredModForm1(folder, outputFile):
    if isModulesExists(folder):
        return
    manifestsFolder = getManifestsFolder(folder) #repo-level manifests folder
    if manifestsFolder == "":
        Utilities.reportSmell(outputFile, manifestsFolder, CONSTS.SMELL_UNS_MOD_1, CONSTS.REPO_MANIFEST)
        return
    if FileOperations.countPuppetFiles(manifestsFolder) > CONSTS.MAX_MANIFESTS_PUPPET_FILES:
        Utilities.reportSmell(outputFile, manifestsFolder, CONSTS.SMELL_UNS_MOD_1, CONSTS.REPO_MANIFEST)
예제 #21
0
 def getNodeDeclarations(self):
     compiledRE = re.compile(SMCONSTS.NODE_REGEX)
     nodeResourceList = []
     for match in (compiledRE.findall(self.fileText)):
         nodeResourceText = self.extractResourceText(match)
         Utilities.myPrint("Extracted node declaration: " +
                           nodeResourceText)
         nodeResourceObj = SourceModel.SM_Node.SM_Node(nodeResourceText)
         nodeResourceList.append(nodeResourceObj)
     return nodeResourceList
예제 #22
0
 def getServiceResourceList(self):
     compiledRE = re.compile(SMCONSTS.SERVICE_REGEX)
     serviceResourceList = []
     for match in (compiledRE.findall(self.fileText)):
         serviceResourceText = self.extractResourceText(match)
         Utilities.myPrint("Extracted service declaration: " +
                           serviceResourceText)
         serviceResourceObj = SourceModel.SM_ServiceResource.SM_ServiceResource(
             serviceResourceText)
         serviceResourceList.append(serviceResourceObj)
     return serviceResourceList
예제 #23
0
 def getPackageResourceList(self):
     compiledRE = re.compile(SMCONSTS.PACKAGE_REGEX)
     packageResourceList = []
     for match in (compiledRE.findall(self.fileText)):
         packageResourceText = self.extractResourceText(match)
         Utilities.myPrint("Extracted package declaration: " +
                           packageResourceText)
         packageResourceObj = SourceModel.SM_PackageResource.SM_PackageResource(
             packageResourceText)
         packageResourceList.append(packageResourceObj)
     return packageResourceList
예제 #24
0
 def getFileResourceList(self):
     compiledRE = re.compile(SMCONSTS.FILE_REGEX)
     fileResourceList = []
     for match in (compiledRE.findall(self.fileText)):
         fileResourceText = self.extractResourceText(match)
         Utilities.myPrint("Extracted file declaration: " +
                           fileResourceText)
         fileResourceObj = SourceModel.SM_FileResource.SM_FileResource(
             fileResourceText)
         fileResourceList.append(fileResourceObj)
     return fileResourceList
예제 #25
0
def detectUnsModForm3(folder, outputFile):
    counter = 0
    if os.path.isdir(folder):
        for dir in os.listdir(folder):
            if not (dir == "files" or dir == "manifests" or dir == "templates" or dir == "lib" or dir == "tests" or
                            dir == "spec" or dir.__contains__("readme") or dir.__contains__("README") or
                        dir.__contains__("license") or dir.__contains__("LICENSE") or dir.__contains__("metadata")):
                counter += 1

    if counter > CONSTS.MAX_ALLOWED_NONSTANDARD_FILES:
        Utilities.reportSmell(outputFile, folder, CONSTS.SMELL_UNS_MOD_3, CONSTS.OTHERFILES)
예제 #26
0
 def getClassDeclarationList(self):
     compiledRE = re.compile(SMCONSTS.CLASS_REGEX)
     compiledClassNameRE = re.compile(SMCONSTS.CLASS_NAME_REGEX)
     classList = []
     for match in compiledRE.findall(self.fileText):
         className = compiledClassNameRE.findall(match)[0]
         #print("Class name: %s" % (className))
         classText = self.extractResourceText(match)
         Utilities.myPrint("Extracted class declaration: " + classText)
         classObj = SourceModel.SM_Class.SM_Class(classText, className)
         classList.append(classObj)
     return classList
예제 #27
0
 def getClassDeclarationList(self):
     compiledRE = re.compile(SMCONSTS.CLASS_REGEX)
     compiledClassNameRE = re.compile(SMCONSTS.CLASS_NAME_REGEX)
     classList = []
     for match in compiledRE.findall(self.fileText):
         className = compiledClassNameRE.findall(match)[0]
         #print("Class name: %s" % (className))
         classText = self.extractResourceText(match)
         Utilities.myPrint("Extracted class declaration: " + classText)
         classObj = SourceModel.SM_Class.SM_Class(classText, className)
         classList.append(classObj)
     return classList
예제 #28
0
 def getOnlyIncludeClassesCount(self):
     cnt_of_includes = 0
     compiledIncludeRE = re.compile(SMCONSTS.ONLY_INCLUDE_REGEX)
     declareClassList = []
     for match in (compiledIncludeRE.findall(self.fileText)):
         cnt_of_includes = cnt_of_includes + 1
         #print match
         declareClassText = match
         cleanInclude = re.sub(r'^\s*include \[?(.+)\]?\s*$', r'\1',
                               declareClassText)
         #print "Clean include: ", cleanInclude
         class_name = r'(?:Class\[)?\'?\:{0,2}([\w\d\:\-_\$]+)\'?\]?'
         classRE = re.compile(class_name)
         if ',' in cleanInclude:
             classes = cleanInclude.split(',')
             for c in classes:
                 for m in classRE.findall(c):
                     # Find a variable value in text
                     if m.startswith('$'):
                         #print("Variable: %s" % m)
                         varRE = r'(?:^|\n)\s*\$[\w\d\-_]+\s?=\s?\'?\"?([\w\d\-_]+)\'?\"?\n'
                         compiledVarRE = re.compile(varRE)
                         for v in (compiledVarRE.findall(self.fileText)):
                             #print(v)
                             declareClassName = v
                             #Utilities.myPrint("Extracted include class declaration: " + declareClassText)
                             declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(
                                 declareClassText, declareClassName)
                             declareClassList.append(declareResourceObj)
                             break
                             #print("Variable %s value)
                             #print "if block: Extracted class name:", m
                     else:
                         declareClassName = m
                         Utilities.myPrint(
                             "Extracted include class declaration: " +
                             declareClassText)
                         declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(
                             declareClassText, declareClassName)
                         declareClassList.append(declareResourceObj)
         else:
             for c in classRE.findall(cleanInclude):
                 #print "else block: Extracted class name: ", c
                 declareClassName = c
                 #print("%s" % includeClassText)
                 #Utilities.myPrint("Extracted include class declaration: " + declareClassText)
                 declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(
                     declareClassText, declareClassName)
                 declareClassList.append(declareResourceObj)
     #print "Declre class list contents in the end:", declareClassList
     #print "Total count of includes: ", cnt_of_includes
     return cnt_of_includes
예제 #29
0
def analyze(folder, repoName):
    outputFile = open(folder + "/" + CONSTS.PUPPETEER_OUT_FILE, 'w')

    puppetFileCount = FileOperations.countPuppetFiles(folder)
    outputFile.write(CONSTS.PUPPET_FILE_COUNT + str(puppetFileCount) + "\n")
    Utilities.myPrint(CONSTS.PUPPET_FILE_COUNT + str(puppetFileCount))

    SizeMetrics.collectSizeMetrics(folder, outputFile)

    SmellDectector.detectSmells(folder, outputFile)

    outputFile.close()
    return
예제 #30
0
    def getOnlyRequireCount(self):
        cnt_of_requires = 0
        compiledIncludeRE = re.compile(SMCONSTS.ONLY_REQUIRE_REGEX)
        declareClassList = []
        for match in (compiledIncludeRE.findall(self.fileText)):
            cnt_of_requires = cnt_of_requires + 1
            #print match
            declareClassText = match
            cleanInclude = re.sub(r'^\s*require \[?(.+)\]?\s*$', r'\1',
                                  declareClassText)
            class_name = r'(?:Class\[)?\'?\:{0,2}([\w\d\:\-_\$]+)\'?\]?'
            classRE = re.compile(class_name)
            if ',' in cleanInclude:
                classes = cleanInclude.split(',')
                for c in classes:
                    for m in classRE.findall(c):
                        # Find a variable value in text
                        if m.startswith('$'):
                            #print("Variable: %s" % m)
                            varRE = r'(?:^|\n)\s*\$[\w\d\-_]+\s?=\s?\'?\"?([\w\d\-_]+)\'?\"?\n'
                            compiledVarRE = re.compile(varRE)
                            for v in (compiledVarRE.findall(self.fileText)):
                                #print(v)
                                declareClassName = v

                                declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(
                                    declareClassText, declareClassName)
                                declareClassList.append(declareResourceObj)
                                break
                        else:
                            declareClassName = m
                            Utilities.myPrint(
                                "Extracted include class declaration: " +
                                declareClassText)
                            declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(
                                declareClassText, declareClassName)
                            declareClassList.append(declareResourceObj)
            else:
                for c in classRE.findall(cleanInclude):
                    declareClassName = c

                    declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(
                        declareClassText, declareClassName)
                    declareClassList.append(declareResourceObj)

        return cnt_of_requires
예제 #31
0
 def getPhysicalResourceDeclarationCount(self):
     pkg_count = 0
     compiledRE = re.compile(r'\'.+\'\W*:|\".+\":')
     tempVar = compiledRE.findall(self.resourceText)
     Utilities.myPrint("Found package declarations: " + str(tempVar))
     pkg_count = len(tempVar)
     # Find list type package declarations
     compiledRE = re.compile(r'{\[((\".+?\"),?)+\]:\s*}')
     result = compiledRE.finditer(self.resourceText)
     all_pkgs = ""
     for m in result:
         all_pkgs = m.group(1)
     pkgs = all_pkgs.split(',')
     for pkg in pkgs:
         Utilities.myPrint("Found package declarations: " + str(pkg))
     pkg_count += len(pkgs)
     return pkg_count
예제 #32
0
 def getIncludeClasses(self):
     compiledIncludeRE = re.compile(SMCONSTS.DECLARE_INCLUDE_REGEX)
     compiledResourceRE = re.compile(SMCONSTS.DECLARE_RESOURCE_REGEX)
     declareClassList = []
     declareClassName = ""
     for match in (compiledIncludeRE.findall(self.fileText)):
         #print(match)
         declareClassText = match
         cleanInclude = re.sub(r'^\s*include \[?(.+)\]?\s*$', r'\1', declareClassText)
         #print("Clean include: %s" % cleanInclude)
         class_name = r'(?:Class\[)?\'?\:{0,2}([\w\d\:\-_\$]+)\'?\]?'
         classRE = re.compile(class_name)
         if ',' in cleanInclude:
           classes = cleanInclude.split(',')
           for c in classes:
             for m in classRE.findall(c):
               # Find a variable value in text
               if m.startswith('$'):
                 #print("Variable: %s" % m)
                 varRE = r'(?:^|\n)\s*\$[\w\d\-_]+\s?=\s?\'?\"?([\w\d\-_]+)\'?\"?\n'
                 compiledVarRE = re.compile(varRE)
                 for v in (compiledVarRE.findall(self.fileText)):
                   #print(v)
                   declareClassName = v
                   Utilities.myPrint("Extracted include class declaration: " + declareClassText)
                   declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(declareClassText, declareClassName)
                   declareClassList.append(declareResourceObj)
                   break
                   #print("Variable %s value)
               #print("Extracted class name: %s" % m)
               else:
                 declareClassName = m
                 Utilities.myPrint("Extracted include class declaration: " + declareClassText)
                 declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(declareClassText, declareClassName)
                 declareClassList.append(declareResourceObj)
         else:
           for c in classRE.findall(cleanInclude):
             #print("Extracted class name: %s" % c)
             declareClassName = c
         #print("%s" % includeClassText)
             Utilities.myPrint("Extracted include class declaration: " + declareClassText)
             declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(declareClassText, declareClassName)
             declareClassList.append(declareResourceObj)
     for match in (compiledResourceRE.findall(self.fileText)):
         #print(match)
         declareClassText = match
         declareClassName = declareClassText
         #print("%s" % includeClassText)
         Utilities.myPrint("Extracted resource class declaration: " + declareClassText)
         declareResourceObj = SourceModel.SM_IncludeResource.SM_IncludeResource(declareClassText, declareClassName)
         declareClassList.append(declareResourceObj)
     return declareClassList
예제 #33
0
def getLCOM(elementList):
    disconnectedElements = 0
    while len(elementList) > 0:
        disconnectedElements += 1
        curElement = elementList.pop()
        variableList = curElement.getUsedVariables()
        i = 0
        while len(elementList) > 0 and i < len(elementList):
            elementToCompare = elementList[i]
            curVariableList = elementToCompare.getUsedVariables()
            if len(Utilities.intersection(curVariableList, variableList)) > 0:
                variableList = Utilities.summation(curVariableList, variableList)
                elementList.pop(i)
            i += 1

    #print("Computing LCOM : disconnected elements - " + str(disconnectedElements))
    if disconnectedElements > 0:
        LCOM = float("{:.2f}".format(1.0/disconnectedElements))
    else:
        LCOM = float(1.0)
    return LCOM
예제 #34
0
def getLCOM(elementList):
    disconnectedElements = 0
    while len(elementList) > 0:
        disconnectedElements += 1
        curElement = elementList.pop()
        variableList = curElement.getUsedVariables()
        i = 0
        while len(elementList) > 0 and i < len(elementList):
            elementToCompare = elementList[i]
            curVariableList = elementToCompare.getUsedVariables()
            if len(Utilities.intersection(curVariableList, variableList)) > 0:
                variableList = Utilities.summation(curVariableList,
                                                   variableList)
                elementList.pop(i)
            i += 1

    #print("Computing LCOM : disconnected elements - " + str(disconnectedElements))
    if disconnectedElements > 0:
        LCOM = float("{:.2f}".format(1.0 / disconnectedElements))
    else:
        LCOM = float(1.0)
    return LCOM
예제 #35
0
def collectSizeMetrics(folder, outputFile):
    totalClasses = 0
    totalDefines = 0
    totalFiles = 0
    totalPackages = 0
    totalServices = 0
    totalExecs = 0
    totalLOC = 0
    for root, dirs, files in os.walk(folder):
        for file in files:
            if file.endswith(".pp") and not os.path.islink(
                    os.path.join(root, file)):
                Utilities.myPrint("Reading file: " + os.path.join(root, file))
                fileObj = SourceModel.SM_File.SM_File(os.path.join(root, file))

                totalClasses += fileObj.getNoOfClassDeclarations()
                totalDefines += fileObj.getNoOfDefineDeclarations()
                totalFiles += fileObj.getNoOfFileDeclarations()
                totalPackages += fileObj.getNoOfPackageDeclarations()
                totalServices += fileObj.getNoOfServiceDeclarations()
                totalExecs += fileObj.getNoOfExecDeclarations()
                totalLOC += fileObj.getLinesOfCode()

    print("1,TotalClasses," + str(totalClasses) + "\n")

    print("1,TotalDefines," + str(totalDefines) + "\n")

    print("1,TotalFiles," + str(totalFiles) + "\n")

    print("1,TotalPackages," + str(totalPackages) + "\n")

    print("1,TotalServices," + str(totalServices) + "\n")

    print("1,TotalExecs," + str(totalExecs) + "\n")

    print("1,TotalLOC," + str(totalLOC) + "\n")
예제 #36
0
def detectInsModForm2(fileObj, outputFile):
    for aClass in fileObj.getOuterClassList():
        if aClass.getLocWithoutComments() > CONSTS.MAX_CLASS_LOC_THRESHOLD:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_INS_MOD_2, CONSTS.CLASS_RES)

    for aDefine in fileObj.getOuterDefineList():
        if aDefine.getLocWithoutComments() > CONSTS.MAX_DEFINE_LOC_THRESHOLD:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_INS_MOD_2, CONSTS.DEFINE_RES)

    if fileObj.getLinesOfCodeWithoutComments() > CONSTS.MAX_MODULE_LOC_THRESHOLD:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_INS_MOD_2, CONSTS.FILE_RES)
예제 #37
0
def checkWithFileResource(fileObj, outputFile):
    fileResourceList = fileObj.getFileResourceList()
    for fileRes in fileResourceList:
        if fileRes.getPhysicalResourceDeclarationCount() > 1:
            Utilities.reportSmell(outputFile, fileObj.fileName,
                                  CONSTS.SMELL_MUL_ABS_1, CONSTS.FILE_RES)
예제 #38
0
def checkWithServiceResource(fileObj, outputFile):
    serviceResourceList = fileObj.getServiceResourceList()
    for serviceRes in serviceResourceList:
        if serviceRes.getPhysicalResourceDeclarationCount() > 1:
            Utilities.reportSmell(outputFile, fileObj.fileName,
                                  CONSTS.SMELL_MUL_ABS_1, CONSTS.SERVICE_RES)
예제 #39
0
def detectDefEnc(fileObj, outputFile):
    for nodeDecl in fileObj.getNodeDeclarations():
        if nodeDecl.getGlobalVariableCount() > 0:
            Utilities.reportSmell(outputFile, CONSTS.SMELL_DEF_ENC, fileObj.fileName, CONSTS.NODES_RES)
예제 #40
0
def checkWithFileResource(fileObj, outputFile):
    fileResourceList = fileObj.getFileResourceList()
    for fileRes in fileResourceList:
        if fileRes.getPhysicalResourceDeclarationCount() > 1:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_MUL_ABS_1, CONSTS.FILE_RES)
예제 #41
0
 def countEntityDeclaration(self, regEx, entityType):
     compiledRE = re.compile(regEx)
     Utilities.myPrint("Identified " + entityType + " declarations: " + str(compiledRE.findall(self.fileText)) + \
                       " Size: " + str(len(compiledRE.findall(self.fileText))))
     return len(compiledRE.findall(self.fileText))
예제 #42
0
def detectMulAbsInClass(fileObj, outputFile):
    classList = fileObj.getClassDeclarationList()
    for aClass in classList:
        lcom = aClass.getLCOM()
        if lcom < CONSTS.LCOM_THRESHOLD:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_MUL_ABS_2, CONSTS.CLASS_RES)
예제 #43
0
def detectMisAbs(fileObj, outputFile):
    classAndDefineCount = len(fileObj.getOuterClassList() + fileObj.getOuterDefineList())
    outerElementCount = len(fileObj.getOuterElementList())
    if outerElementCount - classAndDefineCount > CONSTS.MISABS_MAX_NON_ABS_COUNT:
        Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_MIS_ABS, CONSTS.FILE_RES)
예제 #44
0
def detectMulAbsInDefine(fileObj, outputFile):
    defineList = fileObj.getDefineDeclarationList()
    for aDefine in defineList:
        if aDefine.getLCOM() < CONSTS.LCOM_THRESHOLD:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_MUL_ABS_2, CONSTS.DEFINE_RES)
예제 #45
0
def detectMulAbsInModule(fileObj, outputFile):
    if fileObj.getLCOM() < CONSTS.LCOM_THRESHOLD:
        Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_MUL_ABS_2, CONSTS.FILE_RES)
예제 #46
0
def detectUnnAbsInModules(fileObj, outputFile):
    lineCount, textSizeCount = fileObj.getBodyTextSize()
    if lineCount < CONSTS.LOC_THRESHOLD_UNNABS and textSizeCount < CONSTS.SIZE_THRESHOLD_UNNABS:
        Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_UNN_ABS, CONSTS.DEFINE_RES)
예제 #47
0
def checkWithPackageResource(fileObj, outputFile):
    packageResourceList = fileObj.getPackageResourceList()
    for packageRes in packageResourceList:
        if packageRes.getPhysicalResourceDeclarationCount() > 1:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_MUL_ABS_1, CONSTS.PACKAGE_RES)
예제 #48
0
def detectMulAbsInDefine(fileObj, outputFile):
    defineList = fileObj.getDefineDeclarationList()
    for aDefine in defineList:
        if aDefine.getLCOM() < CONSTS.LCOM_THRESHOLD:
            Utilities.reportSmell(outputFile, fileObj.fileName,
                                  CONSTS.SMELL_MUL_ABS_2, CONSTS.DEFINE_RES)
예제 #49
0
def checkWithPackageResource(fileObj, outputFile):
    packageResourceList = fileObj.getPackageResourceList()
    for packageRes in packageResourceList:
        if packageRes.getPhysicalResourceDeclarationCount() > 1:
            Utilities.reportSmell(outputFile, fileObj.fileName,
                                  CONSTS.SMELL_MUL_ABS_1, CONSTS.PACKAGE_RES)
예제 #50
0
def detectUnnAbsInDefine(fileObj, outputFile):
    defineList = fileObj.getDefineDeclarationList()
    for aDefine in defineList:
        lineCount, textSizeCount = aDefine.getBodyTextSize()
        if lineCount < CONSTS.LOC_THRESHOLD_UNNABS and textSizeCount < CONSTS.SIZE_THRESHOLD_UNNABS:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_UNN_ABS, CONSTS.DEFINE_RES)
예제 #51
0
def detectUnnAbsInClasses(fileObj, outputFile):
    classList = fileObj.getClassDeclarationList()
    for aClass in classList:
        lineCount, textSizeCount = aClass.getBodyTextSize()
        if lineCount < CONSTS.LOC_THRESHOLD_UNNABS and textSizeCount < CONSTS.SIZE_THRESHOLD_UNNABS:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_UNN_ABS, CONSTS.CLASS_RES)
예제 #52
0
def detectMulAbsInModule(fileObj, outputFile):
    if fileObj.getLCOM() < CONSTS.LCOM_THRESHOLD:
        Utilities.reportSmell(outputFile, fileObj.fileName,
                              CONSTS.SMELL_MUL_ABS_2, CONSTS.FILE_RES)
예제 #53
0
def checkWithServiceResource(fileObj, outputFile):
    serviceResourceList = fileObj.getServiceResourceList()
    for serviceRes in serviceResourceList:
        if serviceRes.getPhysicalResourceDeclarationCount() > 1:
            Utilities.reportSmell(outputFile, fileObj.fileName, CONSTS.SMELL_MUL_ABS_1, CONSTS.SERVICE_RES)
예제 #54
0
def collectSizeMetrics(folder, outputFile):
    totalClasses = 0
    totalDefines = 0
    totalFiles = 0
    totalPackages = 0
    totalServices = 0
    totalExecs = 0
    totalLOC = 0
    for root, dirs, files in os.walk(folder):
        for file in files:
            if file.endswith(".pp") and not os.path.islink(os.path.join(root, file)):
                Utilities.myPrint("Reading file: " + os.path.join(root, file))
                fileObj = SourceModel.SM_File.SM_File(os.path.join(root, file))

                totalClasses += fileObj.getNoOfClassDeclarations()
                totalDefines += fileObj.getNoOfDefineDeclarations()
                totalFiles += fileObj.getNoOfFileDeclarations()
                totalPackages += fileObj.getNoOfPackageDeclarations()
                totalServices += fileObj.getNoOfServiceDeclarations()
                totalExecs += fileObj.getNoOfExecDeclarations()
                totalLOC += fileObj.getLinesOfCode()

    outputFile.write(CONSTS.TOTAL_CLASS_DECLS + str(totalClasses) + "\n")
    Utilities.myPrint(CONSTS.TOTAL_CLASS_DECLS + str(totalClasses))

    outputFile.write(CONSTS.TOTAL_DEFINE_DECLS + str(totalDefines) + "\n")
    Utilities.myPrint(CONSTS.TOTAL_DEFINE_DECLS + str(totalDefines))

    outputFile.write(CONSTS.TOTAL_FILE_RES_DECLS + str(totalFiles) + "\n")
    Utilities.myPrint(CONSTS.TOTAL_FILE_RES_DECLS + str(totalFiles))

    outputFile.write(CONSTS.TOTAL_PACKAGE_RES_DECLS + str(totalPackages) + "\n")
    Utilities.myPrint(CONSTS.TOTAL_PACKAGE_RES_DECLS + str(totalPackages))

    outputFile.write(CONSTS.TOTAL_SERVICE_RES_DECLS + str(totalServices) + "\n")
    Utilities.myPrint(CONSTS.TOTAL_SERVICE_RES_DECLS + str(totalServices))

    outputFile.write(CONSTS.TOTAL_EXEC_DECLS + str(totalExecs) + "\n")
    Utilities.myPrint(CONSTS.TOTAL_EXEC_DECLS + str(totalExecs))

    outputFile.write(CONSTS.TOTAL_LOC + str(totalLOC) + "\n")
    Utilities.myPrint(CONSTS.TOTAL_LOC + str(totalLOC))
예제 #55
0
 def getPhysicalResourceDeclarationCount(self):
     compiledRE = re.compile(r'\'.+\'\W*:|\".+\":')
     tempVar = compiledRE.findall(self.resourceText)
     Utilities.myPrint("Found file declarations: " + str(tempVar))
     return len(tempVar)