#!/usr/bin/env python3 # requires https://github.com/terryyin/lizard import lizard import os import sys folders = [ 'src', 'src/ble', 'src/ble/gatt-service', 'src/classic', ] metrics = {} targets = {} targets['CCN'] = 10 targets['PARAM'] = 7 def metric_sum(name, value): global metrics old = 0 if name in metrics: old = metrics[name] metrics[name] = old + value def metric_list(name, item): global metrics value = [] if name in metrics: value = metrics[name] value.append(item) metrics[name] = value def metric_max(name, max): global metrics if name in metrics: if metrics[name] > max: return metrics[name] = max def metric_measure(metric_name, function_name, actual): metric_max(metric_name + '_MAX', actual) if metric_name in targets: metric_sum(metric_name + '_SUM', actual) if actual > targets[metric_name]: metric_sum(metric_name + '_DEVIATIONS', 1) metric_list(metric_name + '_LIST', function_name) def analyze_file(path): l = lizard.analyze_file(path) for f in l.function_list: metric_sum('FUNC', 1) metric_measure('PARAM', f.name, f.parameter_count) metric_measure('CCN', f.name, f.cyclomatic_complexity ) def analyze_folder(folder_path): for file in sorted(os.listdir(folder_path)): if file.endswith(".c"): analyze_file(folder_path+'/'+file) # find root btstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../..') print ("Targets:") for key,value in sorted(targets.items()): print ('- %-20s: %u' % (key, value)) print ("\nAnalyzing:") for path in folders: print('- %s' % path) analyze_folder(btstack_root + "/" + path) print ("\nResult:") num_funcs = metrics['FUNC'] for key,value in sorted(metrics.items()): if key.endswith('LIST'): continue if key.endswith('_SUM'): average = 1.0 * value / num_funcs metric = key.replace('_SUM','_AVERAGE') print ('- %-20s: %4.3f' % (metric, average)) else: print ('- %-20s: %5u' % (key, value)) for key,value in sorted(metrics.items()): if not key.endswith('LIST'): continue print ("\n%s" % key) print ('\n'.join(value))