|
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