Skip to content

Commit e011754

Browse files
authored
feat: refactor GithubTriggerConfig.repos (#33)
make repos field optional and deprecated add include_repos/exclude_repos instead
1 parent 04e6eb1 commit e011754

5 files changed

Lines changed: 185 additions & 36 deletions

File tree

backend/example/settings.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
app:
2+
debug: true
13
logs:
24
level: DEBUG
35
tasks:

backend/lib/github/clients/gql.py

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,74 @@ def to_dataclass(self) -> typing.Any:
3636
ResponseT = typing.TypeVar("ResponseT", bound=BaseResponse)
3737

3838

39+
@dataclasses.dataclass
40+
class GetRepositoriesRequest(BaseRequest):
41+
owner: str
42+
limit: int = 100
43+
after: str | None = None
44+
45+
document: graphql.DocumentNode = gql.gql(
46+
"""
47+
query myOrgRepos($query: String!, $limit: Int!, $after: String) {
48+
search(query: $query, type: REPOSITORY, first: $limit, after: $after) {
49+
nodes {
50+
... on Repository {
51+
name
52+
owner {
53+
login
54+
}
55+
}
56+
}
57+
pageInfo {
58+
endCursor
59+
hasNextPage
60+
}
61+
}
62+
}
63+
"""
64+
)
65+
66+
@property
67+
def params(self) -> dict[str, typing.Any]:
68+
return {
69+
"query": f"org:{self.owner}",
70+
"limit": self.limit,
71+
"after": self.after,
72+
}
73+
74+
75+
class GetRepositoriesResponse(BaseResponse):
76+
class Search(BaseModel):
77+
class Repository(BaseModel):
78+
class Owner(BaseModel):
79+
login: str
80+
81+
name: str
82+
owner: Owner
83+
84+
class PageInfo(BaseModel):
85+
end_cursor: str
86+
has_next_page: bool
87+
88+
nodes: list[Repository]
89+
page_info: PageInfo
90+
91+
search: Search
92+
93+
def to_dataclass(self) -> list[github_models.Repository]:
94+
return [
95+
github_models.Repository(
96+
name=repository.name,
97+
owner=repository.owner.login,
98+
)
99+
for repository in self.search.nodes
100+
]
101+
102+
39103
@dataclasses.dataclass
40104
class GetRepositoryIssuesRequest(BaseRequest):
41105
owner: str
42-
repo: str
106+
repository: str
43107
created_after: datetime.datetime
44108
limit: int = 100
45109

@@ -67,7 +131,7 @@ class GetRepositoryIssuesRequest(BaseRequest):
67131
@property
68132
def params(self) -> dict[str, typing.Any]:
69133
query = [
70-
f"repo:{self.owner}/{self.repo}",
134+
f"repo:{self.owner}/{self.repository}",
71135
"is:issue",
72136
f"created:>{self.created_after.isoformat()}",
73137
"sort:created-asc",
@@ -112,7 +176,7 @@ def to_dataclass(self) -> list[github_models.Issue]:
112176
@dataclasses.dataclass
113177
class GetRepositoryPRsRequest(BaseRequest):
114178
owner: str
115-
repo: str
179+
repository: str
116180
created_after: datetime.datetime
117181
limit: int = 100
118182

@@ -140,7 +204,7 @@ class GetRepositoryPRsRequest(BaseRequest):
140204
@property
141205
def params(self) -> dict[str, typing.Any]:
142206
query = [
143-
f"repo:{self.owner}/{self.repo}",
207+
f"repo:{self.owner}/{self.repository}",
144208
"is:pr",
145209
f"created:>{self.created_after.isoformat()}",
146210
"sort:created-asc",
@@ -212,6 +276,20 @@ async def _request(self, request: BaseRequest, response_model: type[ResponseT])
212276

213277
return parsed_response
214278

279+
async def get_repositories(
280+
self,
281+
request: GetRepositoriesRequest,
282+
) -> list[github_models.Repository]:
283+
result: list[github_models.Repository] = []
284+
while True:
285+
response = await self._request(request, GetRepositoriesResponse)
286+
result.extend(response.to_dataclass())
287+
if not response.search.page_info.has_next_page:
288+
break
289+
request.after = response.search.page_info.end_cursor
290+
291+
return result
292+
215293
async def get_repository_issues(
216294
self,
217295
request: GetRepositoryIssuesRequest,
@@ -228,6 +306,7 @@ async def get_repository_pull_requests(
228306

229307

230308
__all__ = [
309+
"GetRepositoriesRequest",
231310
"GetRepositoryIssuesRequest",
232311
"GetRepositoryPRsRequest",
233312
"GqlGithubClient",

backend/lib/github/clients/rest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def to_dataclass(self) -> typing.Any:
3838
@dataclasses.dataclass
3939
class GetRepositoryWorkflowRunsRequest(BaseRequest):
4040
owner: str
41-
repo: str
41+
repository: str
4242
created_after: datetime.datetime
4343
per_page: int = 100
4444
page: int = 1
@@ -47,7 +47,7 @@ class GetRepositoryWorkflowRunsRequest(BaseRequest):
4747

4848
@property
4949
def url(self) -> str:
50-
return f"https://api.github.com/repos/{self.owner}/{self.repo}/actions/runs"
50+
return f"https://api.github.com/repos/{self.owner}/{self.repository}/actions/runs"
5151

5252
@property
5353
def params(self) -> dict[str, typing.Any]:

backend/lib/github/models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
import datetime
33

44

5+
@dataclasses.dataclass
6+
class Repository:
7+
owner: str
8+
name: str
9+
10+
511
@dataclasses.dataclass
612
class Issue:
713
id: str
@@ -30,3 +36,11 @@ class WorkflowRun:
3036
status: str
3137
conclusion: str | None
3238
created_at: datetime.datetime
39+
40+
41+
__all__ = [
42+
"Issue",
43+
"PullRequest",
44+
"Repository",
45+
"WorkflowRun",
46+
]

0 commit comments

Comments
 (0)