Skip to content

Commit c9d31ce

Browse files
committed
Removed NBM graph and improved dependencies graph with measurement of relative framework size and strongest coupled dependency
1 parent caceb78 commit c9d31ce

File tree

3 files changed

+35
-27
lines changed

3 files changed

+35
-27
lines changed

swift_code_metrics/_graphics.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import string
22

33
import matplotlib.pyplot as plt
4-
from math import ceil
54
import os
6-
5+
from functional import seq
76
from adjustText import adjust_text
7+
from math import ceil
88
import pygraphviz as pgv
99

1010

@@ -63,12 +63,14 @@ def scattered_plot(self, title, x_label, y_label, data, bands):
6363

6464
self.__render(plt, title)
6565

66-
def directed_graph(self, title, list_of_edges):
66+
def directed_graph(self, title, list_of_nodes, list_of_edges):
6767
dir_graph = pgv.AGraph(directed=True, strict=True, rankdir='TD', name=title)
6868
dir_graph.node_attr['shape'] = 'rectangle'
69-
dir_graph.node_attr['size'] = '10'
70-
for e in list_of_edges:
71-
dir_graph.add_edge(e[0], e[1], label=e[2], color=e[3], fontcolor=e[3])
69+
70+
seq(list_of_nodes).for_each(lambda n: dir_graph.add_node(n[0],
71+
penwidth=ceil((n[1] + 1) / 2), width=(n[1] + 1)))
72+
seq(list_of_edges).for_each(
73+
lambda e: dir_graph.add_edge(e[0], e[1], label=e[2], penwidth=e[3], color=e[4], fontcolor=e[4]))
7274

7375
dir_graph.layout('dot')
7476
try:

swift_code_metrics/_presenter.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
from swift_code_metrics._helpers import ReportingHelpers
12
from swift_code_metrics._metrics import Metrics
23
from ._graphics import Graph
4+
from functional import seq
5+
from math import ceil
6+
37

48
class GraphPresenter:
59
def __init__(self, artifacts_path):
@@ -61,33 +65,34 @@ def distance_from_main_sequence_plot(self, list_of_frameworks, x_ax_f_framework,
6165
scattered_data,
6266
bands)
6367

64-
def dependency_graph(self, list_of_frameworks):
68+
def dependency_graph(self, list_of_frameworks, total_code, total_imports):
6569
"""
6670
Renders the Frameworks dependency graph.
6771
"""
6872

69-
internal_edges = list()
70-
external_edges = list()
73+
nodes = seq(list_of_frameworks).map(lambda fr: (fr.name, ceil(10 * fr.loc / total_code))).list()
7174

72-
for f in list_of_frameworks:
73-
# Internal dependencies graph
74-
internal_dep = Metrics.internal_dependencies(f, list_of_frameworks)
75-
for ind in internal_dep:
76-
internal_edges.append((ind.name, ind.dependent_framework, ind.number_of_imports, 'forestgreen'))
75+
internal_edges = seq(list_of_frameworks) \
76+
.flat_map(lambda fr: Metrics.internal_dependencies(fr, list_of_frameworks)) \
77+
.map(lambda ind: GraphPresenter.__make_edge(ind, total_imports, 'forestgreen'))
7778

78-
# External dependencies graph
79-
external_dep = Metrics.external_dependencies(f, list_of_frameworks)
80-
for ed in external_dep:
81-
external_edges.append((f.name, ed.dependent_framework, ed.number_of_imports, 'orangered'))
79+
external_edges = seq(list_of_frameworks) \
80+
.flat_map(lambda fr: Metrics.external_dependencies(fr, list_of_frameworks)) \
81+
.map(lambda ed: GraphPresenter.__make_edge(ed, total_imports, 'orangered'))
8282

83-
self.__render_directed_graph('Internal dependencies graph', internal_edges)
84-
self.__render_directed_graph('External dependencies graph', external_edges)
83+
self.__render_directed_graph('Internal dependencies graph', nodes, internal_edges)
84+
self.__render_directed_graph('External dependencies graph', nodes, external_edges)
8585

8686
# Total
87-
self.__render_directed_graph('Dependencies graph', internal_edges + external_edges)
87+
self.__render_directed_graph('Dependencies graph', nodes, internal_edges + external_edges)
88+
89+
@staticmethod
90+
def __make_edge(dep, total_imports, color):
91+
return (dep.name, dep.dependent_framework, dep.number_of_imports,
92+
ceil(10 * dep.number_of_imports / total_imports), color)
8893

89-
def __render_directed_graph(self, title, edges):
94+
def __render_directed_graph(self, title, nodes, edges):
9095
try:
91-
self.graph.directed_graph(title, edges)
96+
self.graph.directed_graph(title, nodes, edges)
9297
except ValueError:
9398
print('Please ensure that you have Graphviz (https://www.graphviz.org/download) installed.')

swift_code_metrics/scm.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111

1212
def main():
13-
1413
CLI = ArgumentParser(description='Analyzes the code metrics of a Swift project.')
1514
CLI.add_argument(
1615
'--source',
@@ -80,7 +79,7 @@ def main():
8079
'N. of classes and structs': lambda fr: fr.number_of_concrete_data_structures,
8180
'Lines Of Code - LOC': lambda fr: fr.loc,
8281
'Number Of Comments - NOC': lambda fr: fr.noc,
83-
'N. of methods - NBM': lambda fr: fr.number_of_methods,
82+
'N. of imports - NOI': lambda fr: fr.number_of_imports
8483
}
8584

8685
tests_reports_sorted_data = {
@@ -96,8 +95,10 @@ def main():
9695
lambda fr: analyzer.instability(fr),
9796
lambda fr: analyzer.abstractness(fr))
9897

99-
# Internal dependency graph
100-
graph_presenter.dependency_graph(non_test_frameworks)
98+
# Dependency graph
99+
graph_presenter.dependency_graph(non_test_frameworks,
100+
analyzer.report.non_test_framework_aggregate.loc,
101+
analyzer.report.non_test_framework_aggregate.n_o_i)
101102

102103
# Code distribution
103104
graph_presenter.pie_plot('Code distribution', non_test_frameworks,

0 commit comments

Comments
 (0)