-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathmodels.py
More file actions
146 lines (86 loc) · 3.31 KB
/
Copy pathmodels.py
File metadata and controls
146 lines (86 loc) · 3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
from pydantic import BaseModel, ConfigDict, Field
class Actor(BaseModel):
"""GitHub Actor (User or Bot)."""
login: str
class ReviewNode(BaseModel):
"""Single PR Review State."""
author: Actor | None
state: str
class ReviewConnection(BaseModel):
"""Wrapper for list of PR review nodes from GraphQL API."""
nodes: list[ReviewNode]
class IssueNode(BaseModel):
"""Linked Issue Reference."""
title: str
url: str
class IssueConnection(BaseModel):
"""Wrapper for list of linked issue nodes from GraphQL API."""
nodes: list[IssueNode]
class CommitMessage(BaseModel):
"""Container for a single commit message."""
message: str
class CommitNode(BaseModel):
"""Single Commit in PR."""
commit: CommitMessage
class CommitConnection(BaseModel):
"""Wrapper for list of commit nodes from GraphQL API."""
nodes: list[CommitNode]
class FileNode(BaseModel):
"""Single file path node in GraphQL response."""
path: str
class FileEdge(BaseModel):
"""GraphQL edge wrapper for file node."""
node: FileNode
class FileConnection(BaseModel):
"""Wrapper for list of file edges from GraphQL API."""
edges: list[FileEdge]
class CommentConnection(BaseModel):
"""Wrapper for PR comment count from GraphQL API."""
model_config = ConfigDict(populate_by_name=True)
total_count: int = Field(alias="totalCount")
class ThreadCommentNode(BaseModel):
"""Single review thread comment from GraphQL API."""
author: Actor | None
body: str
createdAt: str
class ThreadCommentConnection(BaseModel):
"""Wrapper for list of review thread comments from GraphQL API."""
nodes: list[ThreadCommentNode]
class ReviewThreadNode(BaseModel):
"""Single review thread with resolution status and comments."""
isResolved: bool
isOutdated: bool
comments: ThreadCommentConnection
class ReviewThreadConnection(BaseModel):
"""Wrapper for list of review thread nodes from GraphQL API."""
nodes: list[ReviewThreadNode]
class PullRequest(BaseModel):
"""
GitHub Pull Request Data Representation.
Maps GraphQL response fields to domain logic requirements.
"""
number: int
title: str
body: str
changed_files: int = Field(alias="changedFiles")
additions: int
deletions: int
merged_at: str | None = Field(None, alias="mergedAt")
author: Actor | None
comments: CommentConnection = Field(default_factory=lambda: CommentConnection(totalCount=0))
closing_issues_references: IssueConnection = Field(alias="closingIssuesReferences")
reviews: ReviewConnection = Field(alias="reviews")
commits: CommitConnection = Field(alias="commits")
files: FileConnection = Field(default_factory=lambda: FileConnection(edges=[]))
review_threads: ReviewThreadConnection | None = Field(None, alias="reviewThreads")
class Repository(BaseModel):
"""Root Repository Node from GraphQL."""
pull_request: PullRequest | None = Field(alias="pullRequest")
pull_requests: dict | None = Field(alias="pullRequests")
class GraphQLResponseData(BaseModel):
"""GraphQL response data container with repository field."""
repository: Repository | None
class GraphQLResponse(BaseModel):
"""Standard GraphQL Response Wrapper."""
data: GraphQLResponseData
errors: list[dict] | None = None