|
13 | 13 | from .client import GithubRestApiClient
|
14 | 14 | from .interpretations.relationship.repository import simplify_repo
|
15 | 15 | from .logging import get_plugin_logger
|
16 |
| -from .types import UserRecord |
| 16 | +from .types import SimplifiedUser, UserRecord |
17 | 17 | from .types.enums import UserRepoType
|
18 | 18 |
|
19 | 19 | logger = get_plugin_logger(__name__)
|
20 | 20 |
|
21 | 21 |
|
22 | 22 | class GithubUserExtractor(Extractor):
|
23 |
| - def __init__(self, **github_client_kwargs: Any): |
| 23 | + def __init__(self, *, include_repos: bool = True, **github_client_kwargs: Any): |
| 24 | + self.include_repos = include_repos is True # handle None |
24 | 25 | self.client = GithubRestApiClient(**github_client_kwargs)
|
25 | 26 |
|
26 | 27 | async def extract_records(self) -> AsyncGenerator[UserRecord]:
|
27 | 28 | """Scrapes the GitHub REST api for all users and converts them to records."""
|
28 |
| - async for user in self.client.fetch_all_users(): |
29 |
| - login = user["login"] |
30 |
| - user["repositories"] = [ |
31 |
| - simplify_repo(repo) |
32 |
| - async for repo in self.client.fetch_repos_for_user( |
33 |
| - user_login=login, |
34 |
| - repo_type=UserRepoType.OWNER, |
35 |
| - ) |
36 |
| - ] |
| 29 | + async for user_short in self.client.fetch_all_users(): |
| 30 | + login = user_short["login"] |
| 31 | + user = await self.client.fetch_user(username=login) |
| 32 | + if user is None: |
| 33 | + continue |
| 34 | + if self.include_repos: |
| 35 | + logger.debug("including repos for %s", user) |
| 36 | + user["repositories"] = await self._user_repos(login=login) |
37 | 37 | logger.debug("yielded GithubUser{login=%s}", login)
|
38 | 38 | yield user
|
| 39 | + |
| 40 | + async def _user_repos(self, *, login: str) -> list[SimplifiedUser]: |
| 41 | + return [ |
| 42 | + simplify_repo(repo) |
| 43 | + async for repo in self.client.fetch_repos_for_user( |
| 44 | + user_login=login, |
| 45 | + repo_type=UserRepoType.OWNER, |
| 46 | + ) |
| 47 | + ] |
0 commit comments