metripy 0.2.8__py3-none-any.whl → 0.3.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of metripy might be problematic. Click here for more details.
- metripy/Application/Analyzer.py +23 -3
- metripy/Application/Application.py +16 -2
- metripy/Application/Config/Config.py +34 -0
- metripy/Application/Config/File/ConfigFileReaderFactory.py +6 -5
- metripy/Application/Config/File/ConfigFileReaderInterface.py +70 -3
- metripy/Application/Config/File/JsonConfigFileReader.py +5 -70
- metripy/Application/Config/File/YamlConfigFileReader.py +17 -0
- metripy/Application/Config/Parser.py +24 -11
- metripy/Application/Config/ProjectConfig.py +64 -0
- metripy/Application/Info.py +36 -0
- metripy/Dependency/Dependency.py +2 -1
- metripy/Dependency/Pip/Pip.py +1 -2
- metripy/Dependency/Pip/PyPi.py +1 -0
- metripy/Git/GitAnalyzer.py +0 -3
- metripy/Import/Json/JsonImporter.py +17 -0
- metripy/LangAnalyzer/AbstractLangAnalyzer.py +4 -3
- metripy/LangAnalyzer/Php/PhpAnalyzer.py +2 -1
- metripy/LangAnalyzer/Python/PythonAnalyzer.py +31 -9
- metripy/LangAnalyzer/Python/PythonHalSteadAnalyzer.py +55 -0
- metripy/LangAnalyzer/Typescript/TypescriptAnalyzer.py +12 -9
- metripy/LangAnalyzer/Typescript/TypescriptAstParser.py +1 -1
- metripy/Metric/Code/AggregatedMetrics.py +12 -5
- metripy/Metric/Code/FileMetrics.py +32 -1
- metripy/Metric/Code/ModuleMetrics.py +5 -5
- metripy/Metric/Code/SegmentedMetrics.py +72 -36
- metripy/Metric/Code/Segmentor.py +44 -0
- metripy/Metric/FileTree/FileTreeParser.py +0 -4
- metripy/Metric/Git/GitMetrics.py +1 -1
- metripy/Metric/ProjectMetrics.py +17 -2
- metripy/Metric/Trend/AggregatedTrendMetric.py +101 -0
- metripy/Metric/Trend/ClassTrendMetric.py +20 -0
- metripy/Metric/Trend/FileTrendMetric.py +46 -0
- metripy/Metric/Trend/FunctionTrendMetric.py +28 -0
- metripy/Metric/Trend/SegmentedTrendMetric.py +29 -0
- metripy/Report/Html/DependencyPageRenderer.py +21 -0
- metripy/Report/Html/FilesPageRenderer.py +28 -0
- metripy/Report/Html/GitAnalysisPageRenderer.py +55 -0
- metripy/Report/Html/IndexPageRenderer.py +40 -0
- metripy/Report/Html/PageRenderer.py +43 -0
- metripy/Report/Html/PageRendererFactory.py +37 -0
- metripy/Report/Html/Reporter.py +49 -130
- metripy/Report/Html/TopOffendersPageRenderer.py +84 -0
- metripy/Report/Html/TrendsPageRenderer.py +114 -0
- metripy/Report/Json/GitJsonReporter.py +3 -1
- metripy/Report/Json/JsonReporter.py +4 -1
- metripy/Report/ReporterFactory.py +4 -2
- metripy/Tree/ClassNode.py +21 -0
- metripy/Tree/FunctionNode.py +66 -1
- metripy/Trend/TrendAnalyzer.py +150 -0
- {metripy-0.2.8.dist-info → metripy-0.3.1.dist-info}/METADATA +3 -3
- metripy-0.3.1.dist-info/RECORD +85 -0
- metripy-0.2.8.dist-info/RECORD +0 -66
- {metripy-0.2.8.dist-info → metripy-0.3.1.dist-info}/WHEEL +0 -0
- {metripy-0.2.8.dist-info → metripy-0.3.1.dist-info}/entry_points.txt +0 -0
- {metripy-0.2.8.dist-info → metripy-0.3.1.dist-info}/licenses/LICENSE +0 -0
- {metripy-0.2.8.dist-info → metripy-0.3.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
from metripy.Metric.Code.FileMetrics import FileMetrics
|
|
2
|
+
from metripy.Metric.ProjectMetrics import ProjectMetrics
|
|
3
|
+
from metripy.Report.Html.PageRenderer import PageRenderer
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TrendsPageRenderer(PageRenderer):
|
|
7
|
+
def __init__(self, template_dir: str, output_dir: str, project_name: str):
|
|
8
|
+
super().__init__(template_dir, output_dir, project_name)
|
|
9
|
+
|
|
10
|
+
def _compile_trend_item(self, file: FileMetrics) -> dict:
|
|
11
|
+
return {
|
|
12
|
+
"name": file.full_name,
|
|
13
|
+
"path": file.full_name,
|
|
14
|
+
"complexity_current": file.totalCc,
|
|
15
|
+
"complexity_prev": round(file.trend.historical_totalCc, 2),
|
|
16
|
+
"complexity_delta": round(file.trend.totalCc_delta, 2),
|
|
17
|
+
"maintainability_current": round(file.maintainabilityIndex, 2),
|
|
18
|
+
"maintainability_prev": round(
|
|
19
|
+
file.trend.historical_maintainabilityIndex, 2
|
|
20
|
+
),
|
|
21
|
+
"maintainability_delta": round(file.trend.maintainabilityIndex_delta, 2),
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
def render(self, metrics: ProjectMetrics):
|
|
25
|
+
# Top improved complexity (complexity went down - negative delta)
|
|
26
|
+
top_improved_complexity = [
|
|
27
|
+
x
|
|
28
|
+
for x in metrics.file_metrics
|
|
29
|
+
if x.trend is not None and x.trend.totalCc_delta < 0
|
|
30
|
+
]
|
|
31
|
+
top_improved_complexity = sorted(
|
|
32
|
+
top_improved_complexity, key=lambda x: x.trend.totalCc_delta
|
|
33
|
+
)[:10]
|
|
34
|
+
|
|
35
|
+
# Top worsened complexity (complexity went up - positive delta)
|
|
36
|
+
top_worsened_complexity = [
|
|
37
|
+
x
|
|
38
|
+
for x in metrics.file_metrics
|
|
39
|
+
if x.trend is not None and x.trend.totalCc_delta > 0
|
|
40
|
+
]
|
|
41
|
+
top_worsened_complexity = sorted(
|
|
42
|
+
top_worsened_complexity, key=lambda x: x.trend.totalCc_delta, reverse=True
|
|
43
|
+
)[:10]
|
|
44
|
+
|
|
45
|
+
# Top improved maintainability (maintainability went up - positive delta)
|
|
46
|
+
top_improved_maintainability = [
|
|
47
|
+
x
|
|
48
|
+
for x in metrics.file_metrics
|
|
49
|
+
if x.trend is not None and round(x.trend.maintainabilityIndex_delta, 2) > 0
|
|
50
|
+
]
|
|
51
|
+
top_improved_maintainability = sorted(
|
|
52
|
+
top_improved_maintainability,
|
|
53
|
+
key=lambda x: x.trend.maintainabilityIndex_delta,
|
|
54
|
+
reverse=True,
|
|
55
|
+
)[:10]
|
|
56
|
+
|
|
57
|
+
# Top worsened maintainability (maintainability went down - negative delta)
|
|
58
|
+
top_worsened_maintainability = [
|
|
59
|
+
x
|
|
60
|
+
for x in metrics.file_metrics
|
|
61
|
+
if x.trend is not None and round(x.trend.maintainabilityIndex_delta, 2) < 0
|
|
62
|
+
]
|
|
63
|
+
top_worsened_maintainability = sorted(
|
|
64
|
+
top_worsened_maintainability,
|
|
65
|
+
key=lambda x: x.trend.maintainabilityIndex_delta,
|
|
66
|
+
)[:10]
|
|
67
|
+
|
|
68
|
+
trend_data = {
|
|
69
|
+
# Segment distributions for each metric
|
|
70
|
+
"loc_segments_current": metrics.total_code_metrics.segmentation_data[
|
|
71
|
+
"loc"
|
|
72
|
+
].to_dict_with_percent(),
|
|
73
|
+
"loc_segments_prev": metrics.total_code_metrics.trend.historical_segmentation_data[
|
|
74
|
+
"loc"
|
|
75
|
+
].to_dict_with_percent(),
|
|
76
|
+
"complexity_segments_current": metrics.total_code_metrics.segmentation_data[
|
|
77
|
+
"complexity"
|
|
78
|
+
].to_dict_with_percent(),
|
|
79
|
+
"complexity_segments_prev": metrics.total_code_metrics.trend.historical_segmentation_data[
|
|
80
|
+
"complexity"
|
|
81
|
+
].to_dict_with_percent(),
|
|
82
|
+
"maintainability_segments_current": metrics.total_code_metrics.segmentation_data[
|
|
83
|
+
"maintainability"
|
|
84
|
+
].to_dict_with_percent(),
|
|
85
|
+
"maintainability_segments_prev": metrics.total_code_metrics.trend.historical_segmentation_data[
|
|
86
|
+
"maintainability"
|
|
87
|
+
].to_dict_with_percent(),
|
|
88
|
+
"method_size_segments_current": metrics.total_code_metrics.segmentation_data[
|
|
89
|
+
"methodSize"
|
|
90
|
+
].to_dict_with_percent(),
|
|
91
|
+
"method_size_segments_prev": metrics.total_code_metrics.trend.historical_segmentation_data[
|
|
92
|
+
"methodSize"
|
|
93
|
+
].to_dict_with_percent(),
|
|
94
|
+
"top_improved_complexity": [
|
|
95
|
+
self._compile_trend_item(x) for x in top_improved_complexity
|
|
96
|
+
],
|
|
97
|
+
"top_improved_maintainability": [
|
|
98
|
+
self._compile_trend_item(x) for x in top_improved_maintainability
|
|
99
|
+
],
|
|
100
|
+
"top_worsened_complexity": [
|
|
101
|
+
self._compile_trend_item(x) for x in top_worsened_complexity
|
|
102
|
+
],
|
|
103
|
+
"top_worsened_maintainability": [
|
|
104
|
+
self._compile_trend_item(x) for x in top_worsened_maintainability
|
|
105
|
+
],
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
self.render_template(
|
|
109
|
+
"trends.html",
|
|
110
|
+
{
|
|
111
|
+
"has_trend_data": metrics.total_code_metrics.trend is not None,
|
|
112
|
+
"trend_data": trend_data,
|
|
113
|
+
},
|
|
114
|
+
)
|
|
@@ -19,4 +19,6 @@ class GitJsonReporter(AbstractJsonReporter):
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
self.put_data(data)
|
|
22
|
-
self.output.writeln(
|
|
22
|
+
self.output.writeln(
|
|
23
|
+
f"<success>Create git json report in {self.config.path}</success>"
|
|
24
|
+
)
|
|
@@ -3,6 +3,7 @@ from metripy.Component.Output.CliOutput import CliOutput
|
|
|
3
3
|
from metripy.Metric.ProjectMetrics import ProjectMetrics
|
|
4
4
|
from metripy.Report.Json.AbstractJsonReporter import AbstractJsonReporter
|
|
5
5
|
|
|
6
|
+
|
|
6
7
|
class JsonReporter(AbstractJsonReporter):
|
|
7
8
|
def __init__(self, config: Config, output: CliOutput):
|
|
8
9
|
self.config = config
|
|
@@ -10,4 +11,6 @@ class JsonReporter(AbstractJsonReporter):
|
|
|
10
11
|
|
|
11
12
|
def generate(self, metrics: ProjectMetrics):
|
|
12
13
|
self.put_data(metrics.to_dict())
|
|
13
|
-
self.output.writeln(
|
|
14
|
+
self.output.writeln(
|
|
15
|
+
f"<success>Create json report in {self.config.path}</success>"
|
|
16
|
+
)
|
|
@@ -8,9 +8,11 @@ from metripy.Report.Json.JsonReporter import JsonReporter
|
|
|
8
8
|
|
|
9
9
|
class ReporterFactory:
|
|
10
10
|
@staticmethod
|
|
11
|
-
def create(
|
|
11
|
+
def create(
|
|
12
|
+
config: ReportConfig, output: CliOutput, project_name: str
|
|
13
|
+
) -> ReporterInterface:
|
|
12
14
|
if config.type == "html":
|
|
13
|
-
return HtmlReporter(config, output)
|
|
15
|
+
return HtmlReporter(config, output, project_name)
|
|
14
16
|
elif config.type == "json":
|
|
15
17
|
return JsonReporter(config, output)
|
|
16
18
|
elif config.type == "csv":
|
metripy/Tree/ClassNode.py
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
from typing import Self
|
|
2
|
+
|
|
3
|
+
from metripy.Metric.Code.Segmentor import Segmentor
|
|
4
|
+
from metripy.Metric.Trend.ClassTrendMetric import ClassTrendMetric
|
|
1
5
|
from metripy.Tree.FunctionNode import FunctionNode
|
|
2
6
|
|
|
3
7
|
|
|
@@ -17,6 +21,8 @@ class ClassNode:
|
|
|
17
21
|
self.real_complexity = real_complexity
|
|
18
22
|
self.functions: list[FunctionNode] = []
|
|
19
23
|
|
|
24
|
+
self.trend: ClassTrendMetric | None = None
|
|
25
|
+
|
|
20
26
|
def to_dict(self) -> dict:
|
|
21
27
|
"""Convert ClassNode to a dictionary for JSON serialization."""
|
|
22
28
|
return {
|
|
@@ -25,8 +31,23 @@ class ClassNode:
|
|
|
25
31
|
"lineno": self.lineno,
|
|
26
32
|
"col_offset": self.col_offset,
|
|
27
33
|
"real_complexity": self.real_complexity,
|
|
34
|
+
"complexity_segment": Segmentor.get_complexity_segment(
|
|
35
|
+
self.real_complexity
|
|
36
|
+
),
|
|
28
37
|
"functions": [func.to_dict() for func in self.functions],
|
|
29
38
|
}
|
|
30
39
|
|
|
31
40
|
def __dict__(self) -> dict:
|
|
32
41
|
return self.to_dict()
|
|
42
|
+
|
|
43
|
+
@staticmethod
|
|
44
|
+
def from_dict(data: dict) -> Self:
|
|
45
|
+
node = ClassNode(
|
|
46
|
+
full_name=data["full_name"],
|
|
47
|
+
name=data["name"],
|
|
48
|
+
lineno=data["lineno"],
|
|
49
|
+
col_offset=data["col_offset"],
|
|
50
|
+
real_complexity=data["real_complexity"],
|
|
51
|
+
)
|
|
52
|
+
node.functions = [FunctionNode.from_dict(d) for d in data["functions"]]
|
|
53
|
+
return node
|
metripy/Tree/FunctionNode.py
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from typing import Self
|
|
3
|
+
|
|
4
|
+
from metripy.Metric.Code.Segmentor import Segmentor
|
|
5
|
+
from metripy.Metric.Trend.FunctionTrendMetric import FunctionTrendMetric
|
|
6
|
+
|
|
7
|
+
|
|
1
8
|
class FunctionNode:
|
|
2
9
|
def __init__(
|
|
3
10
|
self, full_name: str, name: str, lineno: int, col_offset: int, complexity: int
|
|
@@ -21,6 +28,35 @@ class FunctionNode:
|
|
|
21
28
|
self.time = 0
|
|
22
29
|
self.bugs = 0
|
|
23
30
|
self.maintainability_index = 0
|
|
31
|
+
self.trend: FunctionTrendMetric | None = None
|
|
32
|
+
|
|
33
|
+
def get_loc(self) -> int:
|
|
34
|
+
return self.line_end - self.lineno
|
|
35
|
+
|
|
36
|
+
def calc_mi(self):
|
|
37
|
+
|
|
38
|
+
total_volume = self.volume
|
|
39
|
+
total_complexity = self.complexity
|
|
40
|
+
total_length = self.length
|
|
41
|
+
|
|
42
|
+
if total_volume == 0 or total_length == 0:
|
|
43
|
+
return 100.0
|
|
44
|
+
|
|
45
|
+
# PHP maintainability index calculation
|
|
46
|
+
mi_base = max(
|
|
47
|
+
(
|
|
48
|
+
171
|
|
49
|
+
- 5.2 * math.log(total_volume)
|
|
50
|
+
- 0.23 * total_complexity
|
|
51
|
+
- 16.2 * math.log(total_length)
|
|
52
|
+
)
|
|
53
|
+
* 100
|
|
54
|
+
/ 171,
|
|
55
|
+
0,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# no comment weight
|
|
59
|
+
self.maintainability_index = mi_base
|
|
24
60
|
|
|
25
61
|
def to_dict(self) -> dict:
|
|
26
62
|
"""Convert FunctionNode to a dictionary for JSON serialization."""
|
|
@@ -28,8 +64,12 @@ class FunctionNode:
|
|
|
28
64
|
"full_name": self.full_name,
|
|
29
65
|
"name": self.name,
|
|
30
66
|
"lineno": self.lineno,
|
|
67
|
+
"line_end": self.line_end,
|
|
68
|
+
"loc": self.get_loc(),
|
|
69
|
+
"loc_segment": Segmentor.get_loc_segment(self.get_loc()),
|
|
31
70
|
"col_offset": self.col_offset,
|
|
32
71
|
"complexity": self.complexity,
|
|
72
|
+
"complexity_segment": Segmentor.get_complexity_segment(self.complexity),
|
|
33
73
|
"h1": self.h1,
|
|
34
74
|
"h2": self.h2,
|
|
35
75
|
"N1": self.N1,
|
|
@@ -42,8 +82,33 @@ class FunctionNode:
|
|
|
42
82
|
"effort": self.effort,
|
|
43
83
|
"time": self.time,
|
|
44
84
|
"bugs": self.bugs,
|
|
45
|
-
"maintainability_index": self.maintainability_index,
|
|
85
|
+
"maintainability_index": round(self.maintainability_index, 2),
|
|
86
|
+
"maintainability_segment": Segmentor.get_maintainability_segment(
|
|
87
|
+
self.maintainability_index
|
|
88
|
+
),
|
|
46
89
|
}
|
|
47
90
|
|
|
48
91
|
def __dict__(self) -> dict:
|
|
49
92
|
return self.to_dict()
|
|
93
|
+
|
|
94
|
+
@staticmethod
|
|
95
|
+
def from_dict(data: dict) -> Self:
|
|
96
|
+
node = FunctionNode(
|
|
97
|
+
full_name=data["full_name"],
|
|
98
|
+
name=data["name"],
|
|
99
|
+
lineno=data["lineno"],
|
|
100
|
+
col_offset=data["col_offset"],
|
|
101
|
+
complexity=data["complexity"],
|
|
102
|
+
)
|
|
103
|
+
node.line_end = data["line_end"]
|
|
104
|
+
node.vocabulary = data["vocabulary"]
|
|
105
|
+
node.length = data["length"]
|
|
106
|
+
node.calculated_length = data["calculated_length"]
|
|
107
|
+
node.volume = data["volume"]
|
|
108
|
+
node.difficulty = data["difficulty"]
|
|
109
|
+
node.effort = data["effort"]
|
|
110
|
+
node.time = data["time"]
|
|
111
|
+
node.bugs = data["bugs"]
|
|
112
|
+
node.maintainability_index = data["maintainability_index"]
|
|
113
|
+
|
|
114
|
+
return node
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
from metripy.Metric.Code.AggregatedMetrics import AggregatedMetrics
|
|
2
|
+
from metripy.Metric.Code.FileMetrics import FileMetrics
|
|
3
|
+
from metripy.Metric.ProjectMetrics import ProjectMetrics
|
|
4
|
+
from metripy.Metric.Trend.AggregatedTrendMetric import AggregatedTrendMetric
|
|
5
|
+
from metripy.Metric.Trend.ClassTrendMetric import ClassTrendMetric
|
|
6
|
+
from metripy.Metric.Trend.FileTrendMetric import FileTrendMetric
|
|
7
|
+
from metripy.Metric.Trend.FunctionTrendMetric import FunctionTrendMetric
|
|
8
|
+
from metripy.Tree.ClassNode import ClassNode
|
|
9
|
+
from metripy.Tree.FunctionNode import FunctionNode
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TrendAnalyzer:
|
|
13
|
+
def create_file_trend_metric(
|
|
14
|
+
self, file_metric: FileMetrics, historical_file_metric: FileMetrics
|
|
15
|
+
) -> FileTrendMetric:
|
|
16
|
+
return FileTrendMetric(
|
|
17
|
+
historical_loc=historical_file_metric.loc,
|
|
18
|
+
loc=file_metric.loc,
|
|
19
|
+
historical_totalCc=historical_file_metric.totalCc,
|
|
20
|
+
totalCc=file_metric.totalCc,
|
|
21
|
+
historical_avgCcPerFunction=historical_file_metric.avgCcPerFunction,
|
|
22
|
+
avgCcPerFunction=file_metric.avgCcPerFunction,
|
|
23
|
+
historical_maintainabilityIndex=historical_file_metric.maintainabilityIndex,
|
|
24
|
+
maintainabilityIndex=file_metric.maintainabilityIndex,
|
|
25
|
+
historical_avgLocPerFunction=historical_file_metric.avgLocPerFunction,
|
|
26
|
+
avgLocPerFunction=file_metric.avgLocPerFunction,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def create_class_trend_metric(
|
|
30
|
+
self, class_metric: ClassNode, historical_class_metric: ClassNode
|
|
31
|
+
) -> ClassTrendMetric:
|
|
32
|
+
return ClassTrendMetric(
|
|
33
|
+
historical_lineno=historical_class_metric.lineno,
|
|
34
|
+
lineno=class_metric.lineno,
|
|
35
|
+
historical_real_complexity=historical_class_metric.real_complexity,
|
|
36
|
+
real_complexity=class_metric.real_complexity,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
def create_function_trend_metric(
|
|
40
|
+
self, function_metric: FunctionNode, historical_function_metric: FunctionNode
|
|
41
|
+
) -> FunctionTrendMetric:
|
|
42
|
+
return FunctionTrendMetric(
|
|
43
|
+
historical_loc=historical_function_metric.get_loc(),
|
|
44
|
+
loc=function_metric.get_loc(),
|
|
45
|
+
historical_complexity=historical_function_metric.complexity,
|
|
46
|
+
complexity=function_metric.complexity,
|
|
47
|
+
historical_maintainability_index=historical_function_metric.maintainability_index,
|
|
48
|
+
maintainability_index=function_metric.maintainability_index,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
def add_historical_file_trends(
|
|
52
|
+
self,
|
|
53
|
+
file_metrics: list[FileMetrics],
|
|
54
|
+
historical_file_metrics: list[FileMetrics],
|
|
55
|
+
):
|
|
56
|
+
indexed_file_metrics = {m.full_name: m for m in file_metrics}
|
|
57
|
+
indexed_historical_file_metrics = {
|
|
58
|
+
m.full_name: m for m in historical_file_metrics
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
for full_name, file_metric in indexed_file_metrics.items():
|
|
62
|
+
historical_file_metric = indexed_historical_file_metrics.get(full_name)
|
|
63
|
+
if not historical_file_metric:
|
|
64
|
+
continue
|
|
65
|
+
file_metric.trend = self.create_file_trend_metric(
|
|
66
|
+
file_metric, historical_file_metric
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
indexed_class_nodes = {
|
|
70
|
+
n.full_name: n for n in historical_file_metric.class_nodes
|
|
71
|
+
}
|
|
72
|
+
for class_node in file_metric.class_nodes:
|
|
73
|
+
historical_class_node = indexed_class_nodes.get(class_node.full_name)
|
|
74
|
+
if not historical_class_node:
|
|
75
|
+
continue
|
|
76
|
+
class_node.trend = self.create_class_trend_metric(
|
|
77
|
+
class_node, historical_class_node
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
indexed_function_nodes = {
|
|
81
|
+
n.full_name: n for n in historical_class_node.functions
|
|
82
|
+
}
|
|
83
|
+
for function_node in class_node.functions:
|
|
84
|
+
historical_function_node = indexed_function_nodes.get(
|
|
85
|
+
function_node.full_name
|
|
86
|
+
)
|
|
87
|
+
if not historical_function_node:
|
|
88
|
+
continue
|
|
89
|
+
function_node.trend = self.create_function_trend_metric(
|
|
90
|
+
function_node, historical_function_node
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
indexed_function_nodes = {
|
|
94
|
+
n.full_name: n for n in historical_file_metric.function_nodes
|
|
95
|
+
}
|
|
96
|
+
for function_node in file_metric.function_nodes:
|
|
97
|
+
historical_function_node = indexed_function_nodes.get(
|
|
98
|
+
function_node.full_name
|
|
99
|
+
)
|
|
100
|
+
if not historical_function_node:
|
|
101
|
+
continue
|
|
102
|
+
function_node.trend = self.create_function_trend_metric(
|
|
103
|
+
function_node, historical_function_node
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def create_aggregated_trend_metric(
|
|
107
|
+
self,
|
|
108
|
+
aggregated_metric: AggregatedMetrics,
|
|
109
|
+
historical_aggregated_metric: AggregatedMetrics,
|
|
110
|
+
) -> AggregatedTrendMetric:
|
|
111
|
+
return AggregatedTrendMetric(
|
|
112
|
+
historical_loc=historical_aggregated_metric.loc,
|
|
113
|
+
loc=aggregated_metric.loc,
|
|
114
|
+
historical_avgCcPerFunction=historical_aggregated_metric.avgCcPerFunction,
|
|
115
|
+
avgCcPerFunction=aggregated_metric.avgCcPerFunction,
|
|
116
|
+
historical_maintainabilityIndex=historical_aggregated_metric.maintainabilityIndex,
|
|
117
|
+
maintainabilityIndex=aggregated_metric.maintainabilityIndex,
|
|
118
|
+
historical_avgLocPerFunction=historical_aggregated_metric.avgLocPerFunction,
|
|
119
|
+
avgLocPerFunction=aggregated_metric.avgLocPerFunction,
|
|
120
|
+
historical_num_files=historical_aggregated_metric.num_files,
|
|
121
|
+
num_files=aggregated_metric.num_files,
|
|
122
|
+
historical_segmented_loc=historical_aggregated_metric.segmentation_data[
|
|
123
|
+
"loc"
|
|
124
|
+
],
|
|
125
|
+
segmented_loc=aggregated_metric.segmentation_data["loc"],
|
|
126
|
+
historical_segmented_complexity=historical_aggregated_metric.segmentation_data[
|
|
127
|
+
"complexity"
|
|
128
|
+
],
|
|
129
|
+
segmented_complexity=aggregated_metric.segmentation_data["complexity"],
|
|
130
|
+
historical_segmented_maintainability=historical_aggregated_metric.segmentation_data[
|
|
131
|
+
"maintainability"
|
|
132
|
+
],
|
|
133
|
+
segmented_maintainability=aggregated_metric.segmentation_data[
|
|
134
|
+
"maintainability"
|
|
135
|
+
],
|
|
136
|
+
historical_segmented_method_size=historical_aggregated_metric.segmentation_data[
|
|
137
|
+
"methodSize"
|
|
138
|
+
],
|
|
139
|
+
segmented_method_size=aggregated_metric.segmentation_data["methodSize"],
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
def add_historical_project_trends(
|
|
143
|
+
self,
|
|
144
|
+
project_metrics: ProjectMetrics,
|
|
145
|
+
historical_project_metrics: ProjectMetrics,
|
|
146
|
+
):
|
|
147
|
+
project_metrics.total_code_metrics.trend = self.create_aggregated_trend_metric(
|
|
148
|
+
project_metrics.total_code_metrics,
|
|
149
|
+
historical_project_metrics.total_code_metrics,
|
|
150
|
+
)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metripy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: A Python tool to generate multi project, multi language code metric reports
|
|
5
5
|
Author-email: Yannick Zimmermann <yannick.zimmermann@proton.me>
|
|
6
6
|
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://
|
|
7
|
+
Project-URL: Homepage, https://zimmer-yan.github.io/metripy/
|
|
8
8
|
Project-URL: Repository, https://github.com/zimmer-yan/metripy
|
|
9
|
-
Project-URL: Documentation, https://
|
|
9
|
+
Project-URL: Documentation, https://zimmer-yan.github.io/metripy/
|
|
10
10
|
Project-URL: Bug Tracker, https://github.com/zimmer-yan/metripy/issues
|
|
11
11
|
Keywords: code metrics,multi-language,code analysis,git metrics,code visualization,software quality,static analysis,repository insights,developer productivity,codebase health,technical debt,language-agnostic
|
|
12
12
|
Classifier: Development Status :: 3 - Alpha
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
metripy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
metripy/metripy.py,sha256=Iiggyf5cMv3xoJyyec6MpqPLb0afYnPyOYY26oiq6ro,266
|
|
3
|
+
metripy/Application/Analyzer.py,sha256=anomekJMKve_lZEl69yeQEFYas_hTltTqEJmujg5VSo,4953
|
|
4
|
+
metripy/Application/Application.py,sha256=XaSLgZurNVv29KVsIF8Kqu9eI4LOvvDZ6CHgdkLoRwQ,2332
|
|
5
|
+
metripy/Application/Info.py,sha256=LfI8R8LmByK1-kvXRK905QZM_bnGDnE22G6pkNSLalE,868
|
|
6
|
+
metripy/Application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
metripy/Application/Config/Config.py,sha256=QX_uTUJEcAaL0Oyug0dlpVgRVEKliDtXgS-3J10OZQA,1503
|
|
8
|
+
metripy/Application/Config/GitConfig.py,sha256=4y676GYv-FH6QyLxh6IQn64gUG9xOQciMgkXH9pJtb4,220
|
|
9
|
+
metripy/Application/Config/Parser.py,sha256=zK_o7j3XaobSFAYhY4xznGhUTcyYSgQSzde1-BtKvLM,1325
|
|
10
|
+
metripy/Application/Config/ProjectConfig.py,sha256=qY1TpU93LEiRNilQ3Yt0vQxxx9USt8QimhmTaZJzM-s,3078
|
|
11
|
+
metripy/Application/Config/ReportConfig.py,sha256=Vh3S1n2nyH5YNmt8JrfGRTcmYZuqLMxyFnFF5mmxu_4,259
|
|
12
|
+
metripy/Application/Config/File/ConfigFileReaderFactory.py,sha256=EYPRxfjixjMtCp-O-Tx9xBOWq_gO2_NhyG1iYc52YHI,981
|
|
13
|
+
metripy/Application/Config/File/ConfigFileReaderInterface.py,sha256=oUGlAKy4XvoWUMWpKVzIQedH8FgwW5meCb5SiC6B4MQ,2693
|
|
14
|
+
metripy/Application/Config/File/JsonConfigFileReader.py,sha256=s4f1D7l9Od7gzpMa6-WFyJeY7vjJFTQx3xKC76wSWEs,478
|
|
15
|
+
metripy/Application/Config/File/YamlConfigFileReader.py,sha256=kDgWrf9wbVstgQGZ1a1b3zY5L9Lx61NhoXfypZU0w3s,483
|
|
16
|
+
metripy/Component/Debug/Debugger.py,sha256=LhkHzUGNSEPvIvcjZJJob5Fjg5NQhk7Rs43y1Bkc7hw,423
|
|
17
|
+
metripy/Component/File/Finder.py,sha256=1vP3KD98zxBuIShNlfCOVVLbjOQPLJnrIsUvLzxnVnM,1399
|
|
18
|
+
metripy/Component/Output/CliOutput.py,sha256=XJ5vJa7jxoukk4fRuj1UVV7GNkkZx-4Jb_Pl7ZYOSFk,1197
|
|
19
|
+
metripy/Component/Output/ProgressBar.py,sha256=PmYQYwINXn9sYO0FKqT8tF-FaFLrPko-lJfi6jxbNsA,725
|
|
20
|
+
metripy/Dependency/Dependency.py,sha256=McKoOcPhAHBxAliZS865VdfmjKCl2t-jwuuxTO5nelA,1485
|
|
21
|
+
metripy/Dependency/Composer/Composer.py,sha256=tOVo8-NJfn0bRK-K4-hhq394tfigOtE6-5ZXOPTb_jw,1033
|
|
22
|
+
metripy/Dependency/Composer/Packegist.py,sha256=ioeIwNg6Yhz0bk13UpB7saq4eqB0-3Zy9PdfcE3CIbA,1980
|
|
23
|
+
metripy/Dependency/Npm/Npm.py,sha256=OB05MZJ312dRw909Pj4Np4bqHQ5oVOylqnzdfXdRvhM,975
|
|
24
|
+
metripy/Dependency/Npm/NpmOrg.py,sha256=9igY0dZRP2L36jcCsn8I8WgfxjWhJ2FShcIV9ph-Zfs,1551
|
|
25
|
+
metripy/Dependency/Pip/Pip.py,sha256=z3s5b3-V93QFxc_g_gt7qQmyydSH3T6BM3wQ0F3b-Ck,1897
|
|
26
|
+
metripy/Dependency/Pip/PyPi.py,sha256=lHu3Ow84yqRk6uJ0Y8VW2JrMgpFpPjVdWFSGzfeLLmQ,1644
|
|
27
|
+
metripy/Git/GitAnalyzer.py,sha256=XdMIll39ZpmYERGk3Nc9LF7oebePs3NC_9h5wFhN3Y4,2961
|
|
28
|
+
metripy/Import/Json/JsonImporter.py,sha256=yx4RAxA-KpByK9eSKh0OynlZMMA51Xa6wDpTfINiGnE,594
|
|
29
|
+
metripy/LangAnalyzer/AbstractLangAnalyzer.py,sha256=YOnpWAKJqm3eyj-FJc2iCUUXAnfhUirXoTbaXBBmLNM,1953
|
|
30
|
+
metripy/LangAnalyzer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
+
metripy/LangAnalyzer/Generic/HalSteadAnalyzer.py,sha256=z8h3V7mud5NnzQ67I9G3YhTFKHjO6Z-e_ida2d32YZ4,1845
|
|
32
|
+
metripy/LangAnalyzer/Generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
|
+
metripy/LangAnalyzer/Php/PhpAnalyzer.py,sha256=tSOPPmtZj4vFwN4Pn9_L8qD2i511kqEjxMAf64_jpD4,7487
|
|
34
|
+
metripy/LangAnalyzer/Php/PhpBasicAstParser.py,sha256=T717e7hM67HBOZ7mvl7Jr4RkCF-Hq-sUMzk__UTheeU,1874
|
|
35
|
+
metripy/LangAnalyzer/Php/PhpBasicLocAnalyzer.py,sha256=2Vt3pbU0BEy2p8em3ZW_qOe9eGigtpZzVoEhe11S2O8,6229
|
|
36
|
+
metripy/LangAnalyzer/Php/PhpHalSteadAnalyzer.py,sha256=XgEo1dXSpIYWBWt9wEQxigpNdLWs-BteX2U2lVLVpl8,1037
|
|
37
|
+
metripy/LangAnalyzer/Python/PythonAnalyzer.py,sha256=3Ls3L4fwHkyL0SLIBQ-3d61MVzTGkFttYxiQuWNgDHY,6171
|
|
38
|
+
metripy/LangAnalyzer/Python/PythonHalSteadAnalyzer.py,sha256=H8fbBMvJJd7o-o2fF-bXY0ON-cyqLt-AqgXXfzlHoiE,1107
|
|
39
|
+
metripy/LangAnalyzer/Typescript/TypescriptAnalyzer.py,sha256=cyJpanv7eDL9TqYreLgJRLMtkih01fvPJqafv68QjhM,8147
|
|
40
|
+
metripy/LangAnalyzer/Typescript/TypescriptAstParser.py,sha256=i0AVU1Sx0hJ62eho0wwsUgIRLDJLeAiW_jk_jO8WEKA,2919
|
|
41
|
+
metripy/LangAnalyzer/Typescript/TypescriptBasicComplexityAnalyzer.py,sha256=abQXNPywSoplozwwV1qm8tRKyPkCAhxBF8gHigECeZ0,3797
|
|
42
|
+
metripy/LangAnalyzer/Typescript/TypescriptBasicLocAnalyzer.py,sha256=hxNqVGDUBb0Dy4cvQFTqfz5cCJTQ8B4uWu9hBnzSO2Y,2336
|
|
43
|
+
metripy/LangAnalyzer/Typescript/TypescriptHalSteadAnalyzer.py,sha256=yOW_55R4PcTNA2BffCiugqkBH1ONuYkZCFo2No4hz0w,1278
|
|
44
|
+
metripy/Metric/ProjectMetrics.py,sha256=FaG7IlKYX3cx_N3t1Q5N54IE4lZDPeoXQcC3OMq_4UI,3244
|
|
45
|
+
metripy/Metric/Code/AggregatedMetrics.py,sha256=6LaVlw3bsm5bWbjFUb3ECEW_8Mc-_ugHBWjZlVHwU-Q,1878
|
|
46
|
+
metripy/Metric/Code/FileMetrics.py,sha256=BDd9mRrJ0hk74ga7wpAEWYz1tDpNEZsSwYvw8qZdvXY,2422
|
|
47
|
+
metripy/Metric/Code/ModuleMetrics.py,sha256=yovhmfufSIzOQdR5uHmvE4yo9K-50xYXKXBAC4S8DdI,1178
|
|
48
|
+
metripy/Metric/Code/SegmentedMetrics.py,sha256=4ny_EEBTeIE_6pRtTBOSMkYoX5EeHrZnN-xqOrOCxH4,2896
|
|
49
|
+
metripy/Metric/Code/Segmentor.py,sha256=t0kk1dd6qDYuCoFYjuSxgERulW9gProGU9pHjC2MEq8,1173
|
|
50
|
+
metripy/Metric/FileTree/FileTree.py,sha256=X5KeQ26lCEcUcYoa8q6ITO0kpgqphLmXWlG-NGeXpX0,467
|
|
51
|
+
metripy/Metric/FileTree/FileTreeParser.py,sha256=KE-DWyrc0p-ivB91HQI8_-O0CNy7i6qLGBwq6iDIP0E,1197
|
|
52
|
+
metripy/Metric/Git/GitCodeHotspot.py,sha256=zdqmXZu9cELpJ7-KGTW3tbmD2so2R6c0w1gYg2OU1jc,1291
|
|
53
|
+
metripy/Metric/Git/GitContributor.py,sha256=Sn3Rmds7tr1H6CsR8bJ2cfuwG7tRj0vVadD28dKa6OE,1172
|
|
54
|
+
metripy/Metric/Git/GitKnowledgeSilo.py,sha256=arla_KR2zyfw9O5QPDhxBrkc-bfQ-pvQuA6GUgv2c44,946
|
|
55
|
+
metripy/Metric/Git/GitMetrics.py,sha256=6JAlJs_YAVydXm-tIRS1L3CVOQubfwzsnetBMB9iBMQ,5770
|
|
56
|
+
metripy/Metric/Trend/AggregatedTrendMetric.py,sha256=QASv1JwJRyRI3DED96tfFqA6QPdja7WtYBzOquWy4B4,4591
|
|
57
|
+
metripy/Metric/Trend/ClassTrendMetric.py,sha256=yWIPGFMAML_aZSXVTVA3BnQle7KQYC6Q7TajS7m01GM,747
|
|
58
|
+
metripy/Metric/Trend/FileTrendMetric.py,sha256=0h-JqtNp2gz69rhyMRienw-XgbC0MmHJiktVdnoJLiI,1969
|
|
59
|
+
metripy/Metric/Trend/FunctionTrendMetric.py,sha256=c8ZwjgKk4_3rdwjN63LFkgNLdXcglcdi5rXJ0c2m8wM,1118
|
|
60
|
+
metripy/Metric/Trend/SegmentedTrendMetric.py,sha256=nyE4iRa44oNwcj2lM6eyFbo_ngIDfulWckeJyO2b4wM,1254
|
|
61
|
+
metripy/Report/ReporterFactory.py,sha256=36_iF0Plqwcx51UPXpWU1LYGLx6_I4SjAJQGg1BDSrQ,1012
|
|
62
|
+
metripy/Report/ReporterInterface.py,sha256=OZEE3SXpTKNOKQBzPytqxqViUFzPhlBUjkBTMlib0qE,543
|
|
63
|
+
metripy/Report/Csv/Reporter.py,sha256=rC52vfJYavB_9yZ3-QA7aRF0Ez34lkiBOpw2mWll2m8,431
|
|
64
|
+
metripy/Report/Html/DependencyPageRenderer.py,sha256=iCDOV2P-hH8iCZbL6btBIq_mBjhXE4W8LPSVb8pA4l0,868
|
|
65
|
+
metripy/Report/Html/FilesPageRenderer.py,sha256=NUi8RpDMk_fHQZVFO4memz9t32-l2-6c-GmtlRmSQRI,957
|
|
66
|
+
metripy/Report/Html/GitAnalysisPageRenderer.py,sha256=QEPLdzQS4SRIz-gjQ31zaoGTmColiw2nPVP7lf7Bu1g,2039
|
|
67
|
+
metripy/Report/Html/IndexPageRenderer.py,sha256=ckxlJpuejNdmbnEiYXwIBO7AvUwYhqi7pFkoANZcyNI,1534
|
|
68
|
+
metripy/Report/Html/PageRenderer.py,sha256=hWbZ11eO5GEqCwtJTtnstx0Ni0u3OQTHwnYA-qokHKU,1419
|
|
69
|
+
metripy/Report/Html/PageRendererFactory.py,sha256=NnieU-d0rK3n1AmU8duTBVwEkYvllXiKtphwq34NdA8,1710
|
|
70
|
+
metripy/Report/Html/Reporter.py,sha256=JDJ1sRL3KXB0_IESD1U1T0n7a1WUWN0jZyUDQOh6gpM,5449
|
|
71
|
+
metripy/Report/Html/TopOffendersPageRenderer.py,sha256=QTxoLuqaeiD7Ulxe0QaLXVEN5kcW6t8d0O96q-MM1U8,3136
|
|
72
|
+
metripy/Report/Html/TrendsPageRenderer.py,sha256=g8I7JlIfmkOPuwoTKJvml10LFXPdO84VWVU5NqpHXog,4863
|
|
73
|
+
metripy/Report/Json/AbstractJsonReporter.py,sha256=yqpBOO6MAN2HdhwoWOZ7Ler38WbV8DcG5g2oASXe-i8,343
|
|
74
|
+
metripy/Report/Json/GitJsonReporter.py,sha256=kzWXKgoPF1k19bXL8gc728qZT4PlBZdWXXUXG20o0oc,968
|
|
75
|
+
metripy/Report/Json/JsonReporter.py,sha256=teDETahhX0XdvM3TT8U8rqAyQrs_VTMq1aaz7vkD3YQ,607
|
|
76
|
+
metripy/Tree/ClassNode.py,sha256=gsoVTKF2iC5yxksI23fIvYakfElzF-NA43Lj0wDW9OM,1629
|
|
77
|
+
metripy/Tree/FunctionNode.py,sha256=EcoAdjeMC9XB7NE6BGJLqDuTO6r-YlwBQfsyl_AupLU,3540
|
|
78
|
+
metripy/Tree/ModuleNode.py,sha256=YHlkAJKWWjy1oAhg7IdrvYnTOxpBYnq_VJS_ykey5_Y,1238
|
|
79
|
+
metripy/Trend/TrendAnalyzer.py,sha256=Rm0VfxjN61O2-FxhIP8CFO6OT4j9JI7f7kRhJ0GLmBM,6926
|
|
80
|
+
metripy-0.3.1.dist-info/licenses/LICENSE,sha256=7I-LBXpo2Lveofzf06uDAmq0wPN7zbMwInrQZiQCiwc,1063
|
|
81
|
+
metripy-0.3.1.dist-info/METADATA,sha256=lq5XNZcn2_Ptr0T8uMrikb9MV55yGsjlXtiWkA4BhC8,4161
|
|
82
|
+
metripy-0.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
83
|
+
metripy-0.3.1.dist-info/entry_points.txt,sha256=vZI1vreNyXX9XGDUQlOnE2cSBRWNyXOlXXFnEBsVNIA,49
|
|
84
|
+
metripy-0.3.1.dist-info/top_level.txt,sha256=Z-tn-27QGcxzNrsRq7BNPQv2BlXJnMCp8bp2sPdde1Y,8
|
|
85
|
+
metripy-0.3.1.dist-info/RECORD,,
|
metripy-0.2.8.dist-info/RECORD
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
metripy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
metripy/metripy.py,sha256=Iiggyf5cMv3xoJyyec6MpqPLb0afYnPyOYY26oiq6ro,266
|
|
3
|
-
metripy/Application/Analyzer.py,sha256=QoKk7iKvgYp5AwvXnsrEwAxAqWFXNhdn9HHJDkzvj20,4043
|
|
4
|
-
metripy/Application/Application.py,sha256=mmvb2Af3AsfcDVwhf5LB5xVWxE5XmKSSaW_IY7ur2Qw,1971
|
|
5
|
-
metripy/Application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
metripy/Application/Config/Config.py,sha256=VyBBYtbVNkrdevxkIGlASSCgK7pmq2WLW6DVKUMb6B4,353
|
|
7
|
-
metripy/Application/Config/GitConfig.py,sha256=4y676GYv-FH6QyLxh6IQn64gUG9xOQciMgkXH9pJtb4,220
|
|
8
|
-
metripy/Application/Config/Parser.py,sha256=ej3wT8AYtAVg-3q59FtkFb_-pxfy7Hvn4YswAVL8M4A,892
|
|
9
|
-
metripy/Application/Config/ProjectConfig.py,sha256=N2xPkc10NF3mHywR36vpxsrcdJyw-VTFzbwQpLq5uHw,932
|
|
10
|
-
metripy/Application/Config/ReportConfig.py,sha256=Vh3S1n2nyH5YNmt8JrfGRTcmYZuqLMxyFnFF5mmxu_4,259
|
|
11
|
-
metripy/Application/Config/File/ConfigFileReaderFactory.py,sha256=K6p5x5TgF6I0acfq3dnU_wKWRWMD-e1EEa0_nrf7t8g,925
|
|
12
|
-
metripy/Application/Config/File/ConfigFileReaderInterface.py,sha256=atBdkvofs4HNI53ja_Knpi99N1H2NVKg16ohYFlH2bw,281
|
|
13
|
-
metripy/Application/Config/File/JsonConfigFileReader.py,sha256=yUlrbqPU802z8Lbo6oGD1Q_bDT1s_4ODRShrneTavAg,2808
|
|
14
|
-
metripy/Component/Debug/Debugger.py,sha256=LhkHzUGNSEPvIvcjZJJob5Fjg5NQhk7Rs43y1Bkc7hw,423
|
|
15
|
-
metripy/Component/File/Finder.py,sha256=1vP3KD98zxBuIShNlfCOVVLbjOQPLJnrIsUvLzxnVnM,1399
|
|
16
|
-
metripy/Component/Output/CliOutput.py,sha256=XJ5vJa7jxoukk4fRuj1UVV7GNkkZx-4Jb_Pl7ZYOSFk,1197
|
|
17
|
-
metripy/Component/Output/ProgressBar.py,sha256=PmYQYwINXn9sYO0FKqT8tF-FaFLrPko-lJfi6jxbNsA,725
|
|
18
|
-
metripy/Dependency/Dependency.py,sha256=Y2j3xIMvPStzaW_TmsNx122gUxTYTnOGuMIgoUgVLVs,1482
|
|
19
|
-
metripy/Dependency/Composer/Composer.py,sha256=tOVo8-NJfn0bRK-K4-hhq394tfigOtE6-5ZXOPTb_jw,1033
|
|
20
|
-
metripy/Dependency/Composer/Packegist.py,sha256=ioeIwNg6Yhz0bk13UpB7saq4eqB0-3Zy9PdfcE3CIbA,1980
|
|
21
|
-
metripy/Dependency/Npm/Npm.py,sha256=OB05MZJ312dRw909Pj4Np4bqHQ5oVOylqnzdfXdRvhM,975
|
|
22
|
-
metripy/Dependency/Npm/NpmOrg.py,sha256=9igY0dZRP2L36jcCsn8I8WgfxjWhJ2FShcIV9ph-Zfs,1551
|
|
23
|
-
metripy/Dependency/Pip/Pip.py,sha256=b-XkyDGnLISfAchsD9Lo-M03rUZogGlvkhntC2h7WoI,1911
|
|
24
|
-
metripy/Dependency/Pip/PyPi.py,sha256=Hqpk5rUw-sN23tgWVUaYMuLN43BR8LdbmNJzkKq9gEo,1612
|
|
25
|
-
metripy/Git/GitAnalyzer.py,sha256=k1396AKkZHlCHZZTtlBHMNO73Cnhcte2ageXJo4ObVY,3071
|
|
26
|
-
metripy/LangAnalyzer/AbstractLangAnalyzer.py,sha256=Wa7ucL7Wy6J8f13GyCOjRKYFgPuJPuZjE8t24fDUf2U,1896
|
|
27
|
-
metripy/LangAnalyzer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
-
metripy/LangAnalyzer/Generic/HalSteadAnalyzer.py,sha256=z8h3V7mud5NnzQ67I9G3YhTFKHjO6Z-e_ida2d32YZ4,1845
|
|
29
|
-
metripy/LangAnalyzer/Generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
-
metripy/LangAnalyzer/Php/PhpAnalyzer.py,sha256=g4Kj3IjL0BgBUY-Ons1MitdandglK-26R324b9AFBJs,7449
|
|
31
|
-
metripy/LangAnalyzer/Php/PhpBasicAstParser.py,sha256=T717e7hM67HBOZ7mvl7Jr4RkCF-Hq-sUMzk__UTheeU,1874
|
|
32
|
-
metripy/LangAnalyzer/Php/PhpBasicLocAnalyzer.py,sha256=2Vt3pbU0BEy2p8em3ZW_qOe9eGigtpZzVoEhe11S2O8,6229
|
|
33
|
-
metripy/LangAnalyzer/Php/PhpHalSteadAnalyzer.py,sha256=XgEo1dXSpIYWBWt9wEQxigpNdLWs-BteX2U2lVLVpl8,1037
|
|
34
|
-
metripy/LangAnalyzer/Python/PythonAnalyzer.py,sha256=sUNLtFge_1zXqBa5qlaaghxPunaSHQAHPOoS1U3XtQc,5043
|
|
35
|
-
metripy/LangAnalyzer/Typescript/TypescriptAnalyzer.py,sha256=eURSa3EYWP8DBJugcM81ctw3H-wFPzp8U7Gup35AhJM,8106
|
|
36
|
-
metripy/LangAnalyzer/Typescript/TypescriptAstParser.py,sha256=6kEw3tm9_eIOXkBY_V5YCFXHdb_PI-1TDEELrInPSKE,2917
|
|
37
|
-
metripy/LangAnalyzer/Typescript/TypescriptBasicComplexityAnalyzer.py,sha256=abQXNPywSoplozwwV1qm8tRKyPkCAhxBF8gHigECeZ0,3797
|
|
38
|
-
metripy/LangAnalyzer/Typescript/TypescriptBasicLocAnalyzer.py,sha256=hxNqVGDUBb0Dy4cvQFTqfz5cCJTQ8B4uWu9hBnzSO2Y,2336
|
|
39
|
-
metripy/LangAnalyzer/Typescript/TypescriptHalSteadAnalyzer.py,sha256=yOW_55R4PcTNA2BffCiugqkBH1ONuYkZCFo2No4hz0w,1278
|
|
40
|
-
metripy/Metric/ProjectMetrics.py,sha256=YE6-C4kdVyMBqrzTXmPl9HSDk0wqEeOKYGziIYI5Lw0,2735
|
|
41
|
-
metripy/Metric/Code/AggregatedMetrics.py,sha256=fLAuvM6f_ToFICQMsxZ8azNv2OTBQvbzETCJ8vA9SQY,1559
|
|
42
|
-
metripy/Metric/Code/FileMetrics.py,sha256=BnAhjHeJawBV8X4EOLtJ4-aL-VmfKj4AGXmEoRV-gQE,1150
|
|
43
|
-
metripy/Metric/Code/ModuleMetrics.py,sha256=J0eKYFm_m3lIJUjU0YkoADPs6HvNxHkJXHr69QTKXl8,1185
|
|
44
|
-
metripy/Metric/Code/SegmentedMetrics.py,sha256=DqXZsagrz5yicAECXGO8e6xvhY9SivkhJvQKH9TKtaw,1730
|
|
45
|
-
metripy/Metric/FileTree/FileTree.py,sha256=X5KeQ26lCEcUcYoa8q6ITO0kpgqphLmXWlG-NGeXpX0,467
|
|
46
|
-
metripy/Metric/FileTree/FileTreeParser.py,sha256=GUnSX1RZ--nB6srYSy-NZm1VZh34Bgnq2yuAvfpmlUM,1291
|
|
47
|
-
metripy/Metric/Git/GitCodeHotspot.py,sha256=zdqmXZu9cELpJ7-KGTW3tbmD2so2R6c0w1gYg2OU1jc,1291
|
|
48
|
-
metripy/Metric/Git/GitContributor.py,sha256=Sn3Rmds7tr1H6CsR8bJ2cfuwG7tRj0vVadD28dKa6OE,1172
|
|
49
|
-
metripy/Metric/Git/GitKnowledgeSilo.py,sha256=arla_KR2zyfw9O5QPDhxBrkc-bfQ-pvQuA6GUgv2c44,946
|
|
50
|
-
metripy/Metric/Git/GitMetrics.py,sha256=k-MOdHaT6nOgHjQlRjjhrjIk9UjKiPMNKfjNP2WcWjM,5769
|
|
51
|
-
metripy/Report/ReporterFactory.py,sha256=LzB2rMGaTUyEHQ0R3wy4MC8C3yVds16rpDe2TGExFoE,965
|
|
52
|
-
metripy/Report/ReporterInterface.py,sha256=OZEE3SXpTKNOKQBzPytqxqViUFzPhlBUjkBTMlib0qE,543
|
|
53
|
-
metripy/Report/Csv/Reporter.py,sha256=rC52vfJYavB_9yZ3-QA7aRF0Ez34lkiBOpw2mWll2m8,431
|
|
54
|
-
metripy/Report/Html/Reporter.py,sha256=ePKXp1ZEwRSb5s2a0kjSobtiYDkr0YZ2SYcDeF2lLL4,8457
|
|
55
|
-
metripy/Report/Json/AbstractJsonReporter.py,sha256=yqpBOO6MAN2HdhwoWOZ7Ler38WbV8DcG5g2oASXe-i8,343
|
|
56
|
-
metripy/Report/Json/GitJsonReporter.py,sha256=-kirTcruclxGnbEAMdE3waPO8jLoIaFCphJiKkFkQ9M,946
|
|
57
|
-
metripy/Report/Json/JsonReporter.py,sha256=To9sr2OJ39OqaAO1ynhy1fm4SK8Pa69Ubaf-YV-uRns,584
|
|
58
|
-
metripy/Tree/ClassNode.py,sha256=uh2JJ3s9H6sCcj_ppElODUvvA525oHVnuhrW-ktzMj8,916
|
|
59
|
-
metripy/Tree/FunctionNode.py,sha256=c2T78uGVkNRF_c2jCVmtfAwNFeY3MgASbUApROAsl3c,1520
|
|
60
|
-
metripy/Tree/ModuleNode.py,sha256=YHlkAJKWWjy1oAhg7IdrvYnTOxpBYnq_VJS_ykey5_Y,1238
|
|
61
|
-
metripy-0.2.8.dist-info/licenses/LICENSE,sha256=7I-LBXpo2Lveofzf06uDAmq0wPN7zbMwInrQZiQCiwc,1063
|
|
62
|
-
metripy-0.2.8.dist-info/METADATA,sha256=XBX7suXhXc9RC_UeYDDx8LDaHdOAn_T5tTr0t9gcjiA,4168
|
|
63
|
-
metripy-0.2.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
64
|
-
metripy-0.2.8.dist-info/entry_points.txt,sha256=vZI1vreNyXX9XGDUQlOnE2cSBRWNyXOlXXFnEBsVNIA,49
|
|
65
|
-
metripy-0.2.8.dist-info/top_level.txt,sha256=Z-tn-27QGcxzNrsRq7BNPQv2BlXJnMCp8bp2sPdde1Y,8
|
|
66
|
-
metripy-0.2.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|