Skip to content

Commit 54e66be

Browse files
committed
Add functionality to retrieve and calculate total forks made by the user, enhancing repository statistics. Introduce a new GraphQL query for user-forked repositories and update the forks property to include both received and made forks.
1 parent dbc6a75 commit 54e66be

File tree

1 file changed

+72
-5
lines changed

1 file changed

+72
-5
lines changed

github_stats.py

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,31 @@ def all_contribs(cls, years: List[str]) -> str:
296296
}}
297297
"""
298298

299+
@staticmethod
300+
def user_forked_repos() -> str:
301+
"""
302+
:return: GraphQL query to get repositories forked by the user
303+
"""
304+
return """
305+
query {
306+
viewer {
307+
repositories(first: 100, isFork: true, ownerAffiliations: OWNER) {
308+
totalCount
309+
pageInfo {
310+
hasNextPage
311+
endCursor
312+
}
313+
nodes {
314+
nameWithOwner
315+
parent {
316+
nameWithOwner
317+
}
318+
}
319+
}
320+
}
321+
}
322+
"""
323+
299324

300325
class Stats(object):
301326
"""
@@ -322,6 +347,7 @@ def __init__(
322347
self._name: Optional[str] = None
323348
self._stargazers: Optional[int] = None
324349
self._forks: Optional[int] = None
350+
self._forks_made: Optional[int] = None
325351
self._total_contributions: Optional[int] = None
326352
self._total_commits: Optional[int] = None
327353
self._prs: Optional[int] = None
@@ -508,13 +534,19 @@ async def stargazers(self) -> int:
508534
@property
509535
async def forks(self) -> int:
510536
"""
511-
:return: total number of forks on user's repos
537+
:return: total number of forks on user's repos + forks made by user
512538
"""
513-
if self._forks is not None:
514-
return self._forks
515-
await self.get_stats()
539+
if self._forks is None:
540+
await self.get_stats()
516541
assert self._forks is not None
517-
return self._forks
542+
forks_received = self._forks
543+
544+
forks_made = await self.forks_made
545+
546+
total_forks = forks_received + forks_made
547+
print(f"Total forks: {forks_received} received + {forks_made} made = {total_forks}")
548+
549+
return total_forks
518550

519551
@property
520552
async def languages(self) -> Dict:
@@ -696,6 +728,41 @@ async def issues(self) -> int:
696728
assert self._issues is not None
697729
return self._issues
698730

731+
async def get_user_forks(self) -> None:
732+
"""
733+
Get repositories forked by the user
734+
"""
735+
if self._forks_made is not None:
736+
return
737+
738+
print("Fetching forks made by user...")
739+
raw_results = await self.queries.query(Queries.user_forked_repos())
740+
741+
if raw_results is None:
742+
self._forks_made = 0
743+
return
744+
745+
viewer = raw_results.get("data", {}).get("viewer", {})
746+
if not viewer:
747+
self._forks_made = 0
748+
return
749+
750+
repositories = viewer.get("repositories", {})
751+
self._forks_made = repositories.get("totalCount", 0)
752+
753+
print(f"Found {self._forks_made} forks made by user")
754+
755+
@property
756+
async def forks_made(self) -> int:
757+
"""
758+
:return: total number of forks made by the user
759+
"""
760+
if self._forks_made is not None:
761+
return self._forks_made
762+
await self.get_user_forks()
763+
assert self._forks_made is not None
764+
return self._forks_made
765+
699766
###############################################################################
700767
# Main Function
701768
###############################################################################

0 commit comments

Comments
 (0)