#! /usr/bin/env python # Copyright (c) 2017 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # import sys import itertools import LongBow def computeVocabularyScore(tokenCount): return 100.0 def csvFunctionResult(file, function): score = computeVocabularyScore(file.token_count) string = "vocabulary,%s,%s,%d,%d,%.2f" % (file.filename, function.name, function.start_line, function.token_count, score) LongBow.scorePrinter([90, 80], score, string) return function.token_count def csvFileVocabulary(file): score = computeVocabularyScore(file.token_count) string = "vocabulary,%s,,,%.2f,%.2f" % (file.filename, file.average_token, score) LongBow.scorePrinter([90, 80], score, string) return def csvFunction(fileInformationList): for fileInformation in fileInformationList: complexities = map(lambda function: csvFunctionResult(fileInformation, function), fileInformation) return def csvSummary(fileInformationList): map(lambda file: csvFileVocabulary(file), fileInformationList) return def textFunctionResult(file, function, maxFileNameLength, maxFunctionNameLength): score = computeVocabularyScore(function.token_count) format = "%-" + str(maxFileNameLength) + "s %-" + str(maxFunctionNameLength) + "s %3d %3d %6.2f" string = format % (file.filename, function.name, function.start_line, function.token_count, score) LongBow.scorePrinter([90, 80], score, string) return function.cyclomatic_complexity def textFileVocabulary(file, maxFileNameLength, printFormat=""): score = computeVocabularyScore(file.average_CCN) if printFormat == "": printFormat = "%-" + str(maxFileNameLength) + "s %6.2f %6.2f" string = printFormat % (file.filename, file.average_token, score) LongBow.scorePrinter([90, 80], score, string) return def computeMaxFileNameLength(fileInformationList): result = 0 for fileInformation in fileInformationList: if len(fileInformation.filename) > result: result = len(fileInformation.filename) return result def computeMaxFunctionNameLength(fileInformationList): result = 0 for fileInformation in fileInformationList: if len(fileInformation.filename) > result: result = len(fileInformation.filename) return result def textFunction(fileInformationList): maxFileNameLength = max(map(lambda fileInformation: len(fileInformation.filename), fileInformationList)) maxFunctionNameLength = max(map(lambda fileInformation: max(map(lambda function: len(function.name), fileInformation)), fileInformationList)) for fileInformation in fileInformationList: complexities = map(lambda function: textFunctionResult(fileInformation, function, maxFileNameLength, maxFunctionNameLength), fileInformation) return def textSummary(fileInformationList, prefix=""): if len(fileInformationList) < 1: print "%sNo Files To Grade" % prefix return maxFileNameLength = max(map(lambda fileInformation: len(fileInformation.filename), fileInformationList)) printFormat = prefix + "%-" + str(maxFileNameLength) + "s %10s %6s" print printFormat % ("File Path", "Ave Token", "Score") printFormat = prefix + "%-" + str(maxFileNameLength) + "s %10.2f %6.2f" map(lambda file: textFileVocabulary(file, maxFileNameLength, printFormat), fileInformationList) return def computeAverage(fileInformationList): vocabulary = map(lambda fileInformation : fileInformation.average_token, fileInformationList) sum = reduce(lambda sum, x: sum + x, vocabulary) return float(sum) / float(len(vocabulary)) def gradeAndPrint(fileList, hfcca, problemsOnly=False, prefix=""): options, arguments = hfcca.createHfccaCommandLineParser().parse_args(args=["foo"]) result = hfcca.analyze(fileList, options) # Convert from that iterator to a simple list... fileInformationList = map(lambda x : x, result) if problemsOnly: fileInformationList = filter(lambda item: computeVocabularyScore(item.average_CCN) < 100, fileInformationList) textSummary(fileInformationList, prefix) def commandLineMain(args, hfcca): targets = [] if args.stdin: for line in sys.stdin: t = line.strip() if (len(t) > 0): targets.append(t) else: targets = args.files if (len(targets) == 0): print >> sys.stderr, "Error: target list cannot be empty" # If nothing was specified, print the summary as a default if args.summary == False and args.function == False and args.average == False: args.summary = True options, arguments = hfcca.createHfccaCommandLineParser().parse_args(args=["VocabularyReport"]) result = hfcca.analyze(targets, options) # Convert from that iterator to a simple list... fileInformationList = map(lambda x : x, result) if args.function: if args.output == "text": textFunction(fileInformationList) else: csvFunction(fileInformationList) if args.summary: if args.output == "text": textSummary(fileInformationList) else: csvSummary(fileInformationList) if args.average: print "%.2f" % computeAverage(fileInformationList)