1+ from datetime import datetime , timedelta
2+
3+ ISSUE_THRESHOLD = 3
4+
5+ def get_week_start (date_obj ):
6+ """
7+ Returns the Monday of the week for a given data
8+ """
9+ return (date_obj - timedelta (days = date_obj .weekday ())).date ()
10+
11+ def parse_closed_dates (closed_issue_dates ):
12+ """
13+ Converts a list of date strings or datetime objects into datetime objects
14+ Skips invalid or empty values
15+ """
16+ parsed_dates = []
17+
18+ for value in closed_issue_dates :
19+ if not value :
20+ continue
21+
22+ if isinstance (value , datetime ):
23+ parsed_dates .append (value )
24+ continue
25+
26+ try :
27+ parsed_dates .append (datetime .fromisoformat (value .replace ("Z" , "+00:00" )))
28+ except (ValueError , AttributeError ):
29+ continue
30+
31+ return parsed_dates
32+
33+ def group_issues_by_week (closed_issue_dates ):
34+ """
35+ Counts how many issues were closed in each week
36+ Returns a dictionary like:
37+ {
38+ week_start_date: count
39+ }
40+ """
41+ weekly_counts = {}
42+
43+ parsed_dates = parse_closed_dates (closed_issue_dates )
44+
45+ for closed_date in parsed_dates :
46+ week_start = get_week_start (closed_date )
47+ weekly_counts [week_start ] = weekly_counts .get (week_start , 0 ) + 1
48+
49+ return weekly_counts
50+
51+ def calculate_current_streak (closed_issue_dates , threshold = ISSUE_THRESHOLD , reference_date = None ):
52+ """
53+ Calculates the active streak based on weekly issue closure threshold
54+
55+ A streak increases by 1 for every consecutive week where
56+ the number of closed issues meets or exceeds the threshold
57+
58+ Args:
59+ closed_issue_dates: list of datetime objects or ISO date strings
60+ threshold: minimum number of issues closed in a week
61+ reference_date: optional datetime to use instead of current time
62+
63+ Returns:
64+ int: current streak count
65+ """
66+ if reference_date is None :
67+ reference_date = datetime .now ()
68+
69+ weekly_counts = group_issues_by_week (closed_issue_dates )
70+
71+ if not weekly_counts :
72+ return 0
73+
74+ current_week_start = get_week_start (reference_date )
75+ streak = 0
76+
77+ while weekly_counts .get (current_week_start , 0 ) >= threshold :
78+ streak += 1
79+ current_week_start -= timedelta (days = 7 )
80+
81+ return streak
82+
83+ def count_total_closed_issues (closed_issue_dates ):
84+ """
85+ Returns the total number of valid closed issue dates
86+ """
87+ return len (parse_closed_dates (closed_issue_dates ))
0 commit comments