|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
3 | 3 | from dataclasses import dataclass |
| 4 | +from datetime import datetime |
4 | 5 | from enum import Enum, auto |
5 | 6 | from functools import cached_property |
6 | | -from typing import Any, Awaitable, Callable, List, Self, cast |
| 7 | +from typing import Any, Awaitable, Callable, List, Self, cast, overload |
7 | 8 |
|
8 | 9 | from discord import Color |
9 | 10 | from githubkit import Paginator, Response |
10 | | -from githubkit.rest import Issue, PullRequest |
| 11 | +from githubkit.rest import Issue, IssuePropPullRequest, PullRequest |
11 | 12 |
|
12 | 13 |
|
13 | 14 | class IssueState(Enum): |
@@ -42,15 +43,38 @@ class PullRequestState(Enum): |
42 | 43 | MERGED = auto() |
43 | 44 | CLOSED = auto() |
44 | 45 |
|
| 46 | + @overload |
45 | 47 | @classmethod |
46 | | - def of(cls, pr: PullRequest) -> PullRequestState: |
| 48 | + def of(cls, pr: Issue) -> PullRequestState | None: ... |
| 49 | + |
| 50 | + @overload |
| 51 | + @classmethod |
| 52 | + def of(cls, pr: PullRequest) -> PullRequestState: ... |
| 53 | + |
| 54 | + @classmethod |
| 55 | + def of(cls, pr: Issue | PullRequest) -> PullRequestState | None: |
47 | 56 | match pr: |
48 | | - case PullRequest(state="open", draft=True): |
| 57 | + case Issue() if not pr.pull_request: |
| 58 | + return None |
| 59 | + |
| 60 | + case ( |
| 61 | + Issue(state="open", draft=True) |
| 62 | + | PullRequest(state="open", draft=True) |
| 63 | + ): |
49 | 64 | return PullRequestState.DRAFT |
50 | | - case PullRequest(state="open"): |
| 65 | + |
| 66 | + case Issue(state="open") | PullRequest(state="open"): |
51 | 67 | return PullRequestState.OPEN |
52 | | - case PullRequest(state="closed", merged=True): |
| 68 | + |
| 69 | + case ( |
| 70 | + Issue( |
| 71 | + state="closed", |
| 72 | + pull_request=IssuePropPullRequest(merged_at=datetime()), |
| 73 | + ) |
| 74 | + | PullRequest(state="closed", merged=True) |
| 75 | + ): |
53 | 76 | return PullRequestState.MERGED |
| 77 | + |
54 | 78 | case _: |
55 | 79 | return PullRequestState.CLOSED |
56 | 80 |
|
@@ -179,3 +203,9 @@ async def gh_request[T](future: Awaitable[Response[T]]) -> T: |
179 | 203 |
|
180 | 204 | def shorten_sha(sha: str): |
181 | 205 | return sha[:10] |
| 206 | + |
| 207 | + |
| 208 | +def issue_or_pr_state(issue: Issue | PullRequest) -> IssueState | PullRequestState: |
| 209 | + if isinstance(issue, PullRequest): |
| 210 | + return PullRequestState.of(issue) |
| 211 | + return PullRequestState.of(issue) or IssueState.of(issue) |
0 commit comments