@@ -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
300325class 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