import itertools
import operator
import pandas as pd
from refactorguide.smells import Smell
from typing import Dict, List, Tuple
from refactorguide.models import Class, Component, ComponentList, Dependency
components_statistics_headers = ["名称", "依赖数", "坏味道依赖数(*)", "类个数", "坏味道类个数"]
[docs]def components_statistics(components: List[Component]):
def _component_data(component: Component):
return [
component.name,
len(component.dependencies),
len(component.smell_dependencies),
len(component.classes) if isinstance(component, ComponentList) else "N/A",
len(component.smell_dependency_classes) if isinstance(component, ComponentList) else "N/A"
]
return sorted([_component_data(c) for c in components], key=operator.itemgetter(2), reverse=True)
[docs]def group_classes_by_smell_dependency(classes: List[Class]) \
-> Dict[Smell, Dict[Dependency, List[Tuple[Smell, Dependency, Class]]]]:
smell_group = {}
sdc_sorted_by_s = sorted([(s, d, c) for c in classes for d in c.dependencies for s in d.bad_smells],
key=lambda sdc: str(sdc[0]))
for smell, s_sdc_list in itertools.groupby(sdc_sorted_by_s, operator.itemgetter(0)):
sdc_sorted_by_d = sorted(list(s_sdc_list), key=lambda sdc: sdc[1].path)
dependency_group = {}
for dependency, d_sdc_list in itertools.groupby(sdc_sorted_by_d, operator.itemgetter(1)):
sdc_sorted_by_c = sorted(list(d_sdc_list), key=lambda sdc: sdc[2].path)
dependency_group[dependency] = sdc_sorted_by_c
smell_group[smell] = dependency_group
return smell_group
smells_statistics_headers = ["坏味道", "影响的依赖数 (*)", "影响的类个数 (*)"]
[docs]def smells_statistics(smell_group: Dict[Smell, Dict[Dependency, List[Tuple[Smell, Dependency, Class]]]]):
def _smell_data(smell: Smell, dependency_group: Dict[Dependency, List[Tuple[Smell, Dependency, Class]]]):
return [
smell,
len(dependency_group.items()),
sum([len(v) for v in dependency_group.values()])
]
statistics_data = [_smell_data(s, dependency_group) for s, dependency_group in smell_group.items()]
return sorted(statistics_data, key=operator.itemgetter(1), reverse=True)
dependencies_statistics_headers = ["依赖", "影响的类个数(*)"]
[docs]def dependencies_statistics(dependency_group: Dict[Dependency, List[Tuple[Smell, Dependency, Class]]]):
def _dependency_data(dependency: Dependency, sdc_list: List[Tuple[Smell, Dependency, Class]]):
return [
dependency.full_name,
len(sdc_list),
]
statistics_data = [_dependency_data(d, sdc_list) for d, sdc_list in dependency_group.items()]
return sorted(statistics_data, key=operator.itemgetter(1), reverse=True)
[docs]def smell_data_frame(classes: List[Class]):
sdc_list = [
(s,
str(s),
d.layer,
":".join([d.layer, d.module]),
":".join([d.layer, d.module, d.package]),
d.full_name,
d.path,
d,
c.layer,
":".join([c.layer, c.module]),
":".join([c.layer, c.module, c.package]),
c.full_name,
c.path,
c)
for c in classes for d in c.dependencies for s in d.bad_smells
]
return pd.DataFrame.from_records(sdc_list, columns=["Smell",
"Smell.Str",
"Dep.Layer",
"Dep.Module",
"Dep.Package",
"Dep.Name",
"Dep.Path",
"Dep",
"Cls.Layer",
"Cls.Module",
"Cls.Package",
"Cls.Name",
"Cls.Path",
"Cls"])