Calculate programming sessions based on commit gaps.
(commits, max_gap_minutes=120)
| 59 | |
| 60 | |
| 61 | def calculate_programming_sessions(commits, max_gap_minutes=120): |
| 62 | """Calculate programming sessions based on commit gaps.""" |
| 63 | if not commits: |
| 64 | return [] |
| 65 | |
| 66 | sessions = [] |
| 67 | current_session = { |
| 68 | "start": commits[0]["datetime"], |
| 69 | "end": commits[0]["datetime"], |
| 70 | "commits": [commits[0]], |
| 71 | "duration_minutes": 0, |
| 72 | } |
| 73 | |
| 74 | for i in range(1, len(commits)): |
| 75 | prev_commit = commits[i - 1] |
| 76 | curr_commit = commits[i] |
| 77 | |
| 78 | gap_minutes = ( |
| 79 | curr_commit["datetime"] - prev_commit["datetime"] |
| 80 | ).total_seconds() / 60 |
| 81 | |
| 82 | if gap_minutes <= max_gap_minutes: |
| 83 | current_session["end"] = curr_commit["datetime"] |
| 84 | current_session["commits"].append(curr_commit) |
| 85 | current_session["duration_minutes"] = ( |
| 86 | current_session["end"] - current_session["start"] |
| 87 | ).total_seconds() / 60 |
| 88 | else: |
| 89 | sessions.append(current_session) |
| 90 | current_session = { |
| 91 | "start": curr_commit["datetime"], |
| 92 | "end": curr_commit["datetime"], |
| 93 | "commits": [curr_commit], |
| 94 | "duration_minutes": 0, |
| 95 | } |
| 96 | |
| 97 | sessions.append(current_session) |
| 98 | return sessions |
| 99 | |
| 100 | |
| 101 | def analyze_daily_programming(sessions): |