Skip to content

Commit ca6e214

Browse files
committed
feature: added language analyzer
1 parent 23ca22e commit ca6e214

File tree

11 files changed

+136
-8
lines changed

11 files changed

+136
-8
lines changed

.github/workflows/code-check-dev.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,4 @@ jobs:
4444
- run: pipx install "poetry~=2.0.0"
4545
- run: poetry install --with dev
4646
- run: poetry run ruff check --select I .
47-
- run: poetry run pytest --cov=git_analytics --cov-report=term-missing --cov-fail-under=40
47+
- run: poetry run pytest --cov=git_analytics --cov-report=term-missing --cov-fail-under=45

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ poetry run git-analytics
4949

5050
```bash
5151
poetry run pytest
52-
poetry run pytest --cov=git_analytics --cov-report=term-missing --cov-fail-under=40
52+
poetry run pytest --cov=git_analytics --cov-report=term-missing --cov-fail-under=45
5353
```
5454

5555
### Type Checking

git_analytics/analyzers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
from .commit_type import CommitTypeAnalyzer
33
from .commits_summary import CommitsSummaryAnalyzer
44
from .historical_statistics import HistoricalStatisticsAnalyzer
5+
from .language_statistics import LanguageAnalyzer
56
from .lines_statistics import LinesAnalyzer
67

78
__all__ = [
89
"AuthorsStatisticsAnalyzer",
910
"CommitTypeAnalyzer",
1011
"CommitsSummaryAnalyzer",
1112
"HistoricalStatisticsAnalyzer",
13+
"LanguageAnalyzer",
1214
"LinesAnalyzer",
1315
]

git_analytics/analyzers/commit_type.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ class CommitType(Enum):
2424
@dataclass
2525
class Result(AnalyticsResult):
2626
timeseries: Dict[date, Dict[CommitType, int]]
27-
total_counter: Counter
28-
author_total_counter: Dict[str, Counter]
27+
total_counter: Dict[CommitType, int]
28+
author_total_counter: Dict[str, Dict[CommitType, int]]
2929

3030

3131
TYPE_COMMIT_LIST: tuple = tuple(ct.value for ct in CommitType)
@@ -57,6 +57,6 @@ def process(self, commit: AnalyticsCommit) -> None:
5757
def result(self) -> Result:
5858
return Result(
5959
timeseries={dt: dict(counter) for dt, counter in self._by_date.items()},
60-
total_counter=self._total_counter,
61-
author_total_counter=self._author_total_counter,
60+
author_total_counter={author: dict(counter) for author, counter in self._author_total_counter.items()},
61+
total_counter=dict(self._total_counter),
6262
)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from collections import defaultdict
2+
from dataclasses import dataclass
3+
from typing import Dict
4+
5+
from git_analytics.entities import AnalyticsCommit, AnalyticsResult
6+
from git_analytics.interfaces import CommitAnalyzer
7+
8+
9+
@dataclass
10+
class FileExtensionChangeStats:
11+
insertions: int = 0
12+
deletions: int = 0
13+
14+
15+
@dataclass
16+
class Result(AnalyticsResult):
17+
files_extensions_total: Dict[str, FileExtensionChangeStats]
18+
files_extensions_by_author: Dict[str, Dict[str, FileExtensionChangeStats]]
19+
20+
21+
def _get_file_extension(file_path: str) -> str:
22+
filename = file_path.split("/")[-1]
23+
filename_parts = filename.split(".")
24+
if len(filename_parts) == 1 or filename_parts[0] == "":
25+
return "no_extension"
26+
return filename_parts[-1].lower()
27+
28+
29+
class LanguageAnalyzer(CommitAnalyzer):
30+
name = "language_statistics"
31+
32+
def __init__(self) -> None:
33+
self._total: Dict[str, FileExtensionChangeStats] = defaultdict(FileExtensionChangeStats)
34+
self._by_author: Dict[str, Dict[str, FileExtensionChangeStats]] = defaultdict(
35+
lambda: defaultdict(FileExtensionChangeStats)
36+
)
37+
38+
def process(self, commit: AnalyticsCommit) -> None:
39+
for changed_file in commit.files:
40+
file_extension = _get_file_extension(changed_file)
41+
self._total[file_extension].insertions += commit.files[changed_file].insertions
42+
self._total[file_extension].deletions += commit.files[changed_file].deletions
43+
self._by_author[commit.commit_author][file_extension].insertions += commit.files[changed_file].insertions
44+
self._by_author[commit.commit_author][file_extension].deletions += commit.files[changed_file].deletions
45+
46+
def result(self) -> Result:
47+
return Result(
48+
files_extensions_total=dict(sorted(self._total.items(), key=lambda item: item[1].insertions, reverse=True)),
49+
files_extensions_by_author={
50+
author: dict(sorted(counter.items(), key=lambda item: item[1].insertions, reverse=True))
51+
for author, counter in self._by_author.items()
52+
},
53+
)

git_analytics/entities.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
from typing import Any, Dict
66

77

8+
@dataclass
9+
class FileChangeStats:
10+
insertions: int
11+
deletions: int
12+
13+
814
@dataclass
915
class AnalyticsCommit:
1016
sha: str
@@ -14,6 +20,7 @@ class AnalyticsCommit:
1420
lines_deletions: int
1521
files_changed: int
1622
message: str
23+
files: Dict[str, FileChangeStats]
1724

1825

1926
@dataclass

git_analytics/main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
CommitsSummaryAnalyzer,
88
CommitTypeAnalyzer,
99
HistoricalStatisticsAnalyzer,
10+
LanguageAnalyzer,
1011
LinesAnalyzer,
1112
)
1213
from git_analytics.engine import CommitAnalyticsEngine
@@ -20,6 +21,7 @@ def make_analyzers():
2021
CommitsSummaryAnalyzer(),
2122
CommitTypeAnalyzer(),
2223
HistoricalStatisticsAnalyzer(),
24+
LanguageAnalyzer(),
2325
LinesAnalyzer(),
2426
]
2527

git_analytics/sources/git_commit_adapter.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from git import Repo
44
from git.objects import Commit
55

6-
from git_analytics.entities import AnalyticsCommit
6+
from git_analytics.entities import AnalyticsCommit, FileChangeStats
77
from git_analytics.interfaces import CommitSource
88

99

@@ -25,4 +25,8 @@ def git_commit_to_analytics_commit(commit: Commit) -> AnalyticsCommit:
2525
lines_deletions=commit.stats.total["deletions"],
2626
files_changed=commit.stats.total["files"],
2727
message=str(commit.summary).strip(),
28+
files={
29+
str(file): FileChangeStats(insertions=value.get("insertions", 0), deletions=value.get("deletions", 0))
30+
for file, value in commit.stats.files.items()
31+
},
2832
)

git_analytics/static/js/git-analytics.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ async function loadAndRender(type, value, label) {
6464
buildWeekByAuthorChart(stats.historical_statistics.day_of_week);
6565
buildDayOfMonthByAuthorChart(stats.historical_statistics.day_of_month);
6666
buildLinesChart(stats.lines_statistics.items);
67-
buildCommitTypeChart(stats.commit_type.items);
67+
buildCommitTypeChart(stats.commit_type.timeseries);
6868
buildAuthorsTable(stats.authors_statistics.authors);
6969

7070
} catch (err) {

0 commit comments

Comments
 (0)