Skip to content

Commit

Permalink
add annual kpi
Browse files Browse the repository at this point in the history
  • Loading branch information
luc-github committed Nov 20, 2024
1 parent 53ad0e0 commit 8a90771
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 68 deletions.
43 changes: 22 additions & 21 deletions src/generators/markdown_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -484,24 +484,25 @@ def _generate_activity_kpi_section(self, data: Dict) -> List[str]:
content = [
'## 📊 Activity Rankings',
'',
'Repository activity rankings based on commits, issues, and overall engagement.',
'Repository activity rankings based on activity over different time periods.',
''
]

periods = {
'daily': '24 Hours',
'weekly': '7 Days',
'monthly': '30 Days'
'daily': 'Last 24 Hours',
'weekly': 'Last 7 Days',
'monthly': 'Last 30 Days',
'yearly': 'Last 365 Days'
}

for period, label in periods.items():
content.extend([
f'### Last {label}',
f'### {label}',
'',
'<div class="activity-ranking">',
'',
'| Rank | Repository | Type | Activity Score | Details |',
'|------|------------|------|----------------|----------|'
'| Rank | Repository | Type | Score | Commits | Issues | Activity/Day |',
'|------|------------|------|--------|---------|---------|-------------|'
])

rankings = data['activity_ranking'][period]
Expand All @@ -516,19 +517,20 @@ def _generate_activity_kpi_section(self, data: Dict) -> List[str]:
filled_length = int((score / max_score) * progress_length) if max_score > 0 else 0
progress_bar = "🟦" * filled_length + "⬜" * (progress_length - filled_length)

# Formatter les détails
details = (
f"Commits: {repo['details']['commits']}, "
f"Issues: {repo['details']['issues']}"
)
# Calculer l'activité par jour
commits_per_day = repo['details']['commits_per_day']
issues_per_day = repo['details']['issues_per_day']
daily_activity = commits_per_day * 3 + issues_per_day * 2 # Utiliser les mêmes poids

# Ajouter la ligne du repository
# Formatter la ligne
content.append(
f"| {rank_icon} {rank} | "
f"[{repo['name']}](#{repo['name'].lower()}) | "
f"[{repo['name']}]({repo.get('url', '#')}) | "
f"{repo['type'].title()} | "
f"{progress_bar} ({score}) | "
f"{details} |"
f"{repo['details']['commits']} | "
f"{repo['details']['issues']} | "
f"{daily_activity:.1f} |"
)

content.extend([
Expand All @@ -537,19 +539,18 @@ def _generate_activity_kpi_section(self, data: Dict) -> List[str]:
''
])

# Ajouter une légende
# Ajouter une légende plus détaillée
content.extend([
'### Legend',
'',
'- 🟦 Activity Score (relative to most active repository)',
'- Activity Score = (Commits × 3) + (Issues × 2) + (Comments × 1)',
'- Higher score indicates more activity',
'- 🟦 Activity Score relative to most active repository',
'- Score = (Commits × 3) + (Issues × 2) + (Comments × 1)',
'- Activity/Day = Average daily activity score for the period',
'- Higher scores indicate more activity',
''
])

return content


def _generate_heatmap(self, heatmap_data: List[List[int]]) -> str:
"""Generate colored activity heatmap"""
if not heatmap_data:
Expand Down
91 changes: 44 additions & 47 deletions src/processors/stats_calculator.py
Original file line number Diff line number Diff line change
Expand Up @@ -510,9 +510,10 @@ def calculate_activity_kpi(self, repositories: List[Dict]) -> Dict[str, List[Dic
"""Calculate activity KPIs for all repositories"""
now = datetime.now(timezone.utc)
activity_ranking = {
'daily': [],
'weekly': [],
'monthly': []
'daily': [], # Dernières 24h
'weekly': [], # 7 derniers jours
'monthly': [], # 30 derniers jours
'yearly': [] # 365 derniers jours
}

for repo in repositories:
Expand All @@ -521,50 +522,37 @@ def calculate_activity_kpi(self, repositories: List[Dict]) -> Dict[str, List[Dic
for branch in repo.get('branches', []):
issues.extend(branch.get('issues', []))

# Calculer l'activité
daily_activity = self._calculate_period_activity(repo, commits, issues, days=1)
weekly_activity = self._calculate_period_activity(repo, commits, issues, days=7)
monthly_activity = self._calculate_period_activity(repo, commits, issues, days=30)

# Ajouter aux classements
activity_ranking['daily'].append({
'name': repo['name'],
'type': repo['type'],
'score': daily_activity,
'details': {
'commits': daily_activity['commits'],
'issues': daily_activity['issues'],
'comments': daily_activity['comments']
}
})

activity_ranking['weekly'].append({
'name': repo['name'],
'type': repo['type'],
'score': weekly_activity,
'details': {
'commits': weekly_activity['commits'],
'issues': weekly_activity['issues'],
'comments': weekly_activity['comments']
}
})
# Calculer l'activité pour toutes les périodes
periods = {
'daily': 1,
'weekly': 7,
'monthly': 30,
'yearly': 365
}

activity_ranking['monthly'].append({
'name': repo['name'],
'type': repo['type'],
'score': monthly_activity,
'details': {
'commits': monthly_activity['commits'],
'issues': monthly_activity['issues'],
'comments': monthly_activity['comments']
}
})
for period_name, days in periods.items():
period_activity = self._calculate_period_activity(repo, commits, issues, days)

activity_ranking[period_name].append({
'name': repo['name'],
'type': repo['type'],
'description': repo.get('description', ''),
'url': repo.get('url', ''),
'score': period_activity,
'details': {
'commits': period_activity['commits'],
'issues': period_activity['issues'],
'comments': period_activity['comments'],
'commits_per_day': period_activity['commits'] / days,
'issues_per_day': period_activity['issues'] / days
}
})

# Trier chaque période par score d'activité
for period in activity_ranking:
activity_ranking[period] = sorted(
activity_ranking[period],
key=lambda x: x['score']['total'],
key=lambda x: (x['score']['total'], x['details']['commits_per_day']), # Tri secondaire sur la fréquence des commits
reverse=True
)

Expand All @@ -579,12 +567,19 @@ def _calculate_period_activity(self, repo: Dict, commits: List[Dict], issues: Li
commit_count = sum(1 for commit in commits
if datetime.fromisoformat(commit['date'].replace('Z', '+00:00')) > start_date)

# Compter les issues et commentaires
# Compter les issues actives (créées ou mises à jour)
issue_count = sum(1 for issue in issues
if datetime.fromisoformat(issue['created_at'].replace('Z', '+00:00')) > start_date)
if datetime.fromisoformat(issue['created_at'].replace('Z', '+00:00')) > start_date
or (issue.get('updated_at')
and datetime.fromisoformat(issue['updated_at'].replace('Z', '+00:00')) > start_date))

# Compter les commentaires (si disponibles)
comment_count = sum(
len(issue.get('comments', []))
for issue in issues
if issue.get('comments')
)

# Calculer le score total
# Les poids peuvent être ajustés selon l'importance relative
weights = {
'commits': 3, # Un commit vaut 3 points
'issues': 2, # Une issue vaut 2 points
Expand All @@ -594,9 +589,11 @@ def _calculate_period_activity(self, repo: Dict, commits: List[Dict], issues: Li
activity_score = {
'commits': commit_count,
'issues': issue_count,
'comments': 0, # À implémenter si vous voulez compter les commentaires
'comments': comment_count,
'period_days': days,
'total': (commit_count * weights['commits'] +
issue_count * weights['issues'])
issue_count * weights['issues'] +
comment_count * weights['comments'])
}

return activity_score

0 comments on commit 8a90771

Please sign in to comment.