1313
1414def measure_time_in_draft (
1515 issue : github3 .issues .Issue ,
16+ pull_request : Union [github3 .pulls .PullRequest , None ] = None ,
1617) -> Union [timedelta , None ]:
1718 """If a pull request has had time in the draft state, return the cumulative amount of time it was in draft.
1819
1920 args:
2021 issue (github3.issues.Issue): A GitHub issue which has been pre-qualified as a pull request.
22+ pull_request (github3.pulls.PullRequest, optional): The pull request object.
2123
2224 returns:
2325 Union[timedelta, None]: Total time the pull request has spent in draft state.
@@ -26,6 +28,54 @@ def measure_time_in_draft(
2628 draft_start = None
2729 total_draft_time = timedelta (0 )
2830
31+ # Check if PR was initially created as draft
32+ pr_created_at = None
33+
34+ try :
35+ if pull_request is None :
36+ pull_request = issue .issue .pull_request ()
37+
38+ pr_created_at = datetime .fromisoformat (
39+ issue .issue .created_at .replace ("Z" , "+00:00" )
40+ )
41+
42+ # Look for ready_for_review events to determine if PR was initially draft
43+ ready_for_review_events = []
44+ converted_to_draft_events = []
45+ for event in events :
46+ if event .event == "ready_for_review" :
47+ ready_for_review_events .append (event )
48+ elif event .event == "converted_to_draft" :
49+ converted_to_draft_events .append (event )
50+
51+ # If there are ready_for_review events, check if PR was initially draft
52+ if ready_for_review_events :
53+ first_ready_event = min (ready_for_review_events , key = lambda x : x .created_at )
54+ prior_draft_events = [
55+ e
56+ for e in converted_to_draft_events
57+ if e .created_at < first_ready_event .created_at
58+ ]
59+
60+ if not prior_draft_events :
61+ # PR was initially created as draft, calculate time from creation to first ready_for_review
62+ total_draft_time += first_ready_event .created_at - pr_created_at
63+
64+ # If there are no ready_for_review events but the PR is currently draft, it might be initially draft and still open
65+ elif not ready_for_review_events and not converted_to_draft_events :
66+ # Check if PR is currently draft and open
67+ if (
68+ hasattr (pull_request , "draft" )
69+ and pull_request .draft
70+ and issue .issue .state == "open"
71+ ):
72+ # PR was initially created as draft and is still draft
73+ draft_start = pr_created_at
74+
75+ except (AttributeError , ValueError , TypeError ):
76+ # If we can't get PR info, fall back to original logic
77+ pass
78+
2979 for event in events :
3080 if event .event == "converted_to_draft" :
3181 draft_start = event .created_at
0 commit comments