stats commits pushed on behalf of bot

This commit is contained in:
pseusys
2023-02-26 09:48:03 +01:00
parent 1d2121e747
commit db09a1deed
4 changed files with 21 additions and 14 deletions

View File

@@ -55,4 +55,5 @@ jobs:
INPUT_DEBUG_LOGGING: True # This is for testing purpose only not for production INPUT_DEBUG_LOGGING: True # This is for testing purpose only not for production
DEBUG_RUN: True # This is for testing purpose only not for production DEBUG_RUN: True # This is for testing purpose only not for production
PR_NUMBER: ${{ github.event.number }} # This is for testing purpose only not for production PR_NUMBER: ${{ github.event.number }} # This is for testing purpose only not for production
CURRENT_GITHUB_ACTION_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This is for testing purpose only not for production
run: python3 sources/main.py run: python3 sources/main.py

View File

@@ -227,14 +227,15 @@ class DownloadManager:
return await DownloadManager._get_remote_resource(resource, safe_load) return await DownloadManager._get_remote_resource(resource, safe_load)
@staticmethod @staticmethod
async def _fetch_graphql_query(query: str, **kwargs) -> Dict: async def _fetch_graphql_query(query: str, use_github_action: bool = False, **kwargs) -> Dict:
""" """
Execute GitHub GraphQL API simple query. Execute GitHub GraphQL API simple query.
:param query: Dynamic query identifier. :param query: Dynamic query identifier.
:param use_github_action: Use GitHub actions bot auth token instead of current user.
:param kwargs: Parameters for substitution of variables in dynamic query. :param kwargs: Parameters for substitution of variables in dynamic query.
:return: Response JSON dictionary. :return: Response JSON dictionary.
""" """
headers = {"Authorization": f"Bearer {EM.GH_TOKEN}"} headers = {"Authorization": f"Bearer {EM.GH_TOKEN if not use_github_action else EM.CURRENT_GITHUB_ACTION_TOKEN}"}
res = await DownloadManager._client.post( res = await DownloadManager._client.post(
"https://api.github.com/graphql", json={"query": Template(GITHUB_API_QUERIES[query]).substitute(kwargs)}, headers=headers "https://api.github.com/graphql", json={"query": Template(GITHUB_API_QUERIES[query]).substitute(kwargs)}, headers=headers
) )
@@ -267,19 +268,21 @@ class DownloadManager:
return list(), dict(hasNextPage=False) return list(), dict(hasNextPage=False)
@staticmethod @staticmethod
async def _fetch_graphql_paginated(query: str, **kwargs) -> Dict: async def _fetch_graphql_paginated(query: str, use_github_action: bool = False, **kwargs) -> Dict:
""" """
Execute GitHub GraphQL API paginated query. Execute GitHub GraphQL API paginated query.
Queries 100 new results each time until no more results are left. Queries 100 new results each time until no more results are left.
Merges result list into single query, clears pagination-related info. Merges result list into single query, clears pagination-related info.
:param query: Dynamic query identifier. :param query: Dynamic query identifier.
:param use_github_action: Use GitHub actions bot auth token instead of current user.
:param kwargs: Parameters for substitution of variables in dynamic query. :param kwargs: Parameters for substitution of variables in dynamic query.
:return: Response JSON dictionary. :return: Response JSON dictionary.
""" """
initial_query_response = await DownloadManager._fetch_graphql_query(query, **kwargs, pagination="first: 100") initial_query_response = await DownloadManager._fetch_graphql_query(query, use_github_action, **kwargs, pagination="first: 100")
page_list, page_info = DownloadManager._find_pagination_and_data_list(initial_query_response) page_list, page_info = DownloadManager._find_pagination_and_data_list(initial_query_response)
while page_info["hasNextPage"]: while page_info["hasNextPage"]:
query_response = await DownloadManager._fetch_graphql_query(query, **kwargs, pagination=f'first: 100, after: "{page_info["endCursor"]}"') pagination = f'first: 100, after: "{page_info["endCursor"]}"'
query_response = await DownloadManager._fetch_graphql_query(query, use_github_action, **kwargs, pagination=pagination)
new_page_list, page_info = DownloadManager._find_pagination_and_data_list(query_response) new_page_list, page_info = DownloadManager._find_pagination_and_data_list(query_response)
page_list += new_page_list page_list += new_page_list
_, page_info = DownloadManager._find_pagination_and_data_list(initial_query_response) _, page_info = DownloadManager._find_pagination_and_data_list(initial_query_response)
@@ -287,7 +290,7 @@ class DownloadManager:
return initial_query_response return initial_query_response
@staticmethod @staticmethod
async def get_remote_graphql(query: str, **kwargs) -> Dict: async def get_remote_graphql(query: str, use_github_action: bool = False, **kwargs) -> Dict:
""" """
Execute GitHub GraphQL API query. Execute GitHub GraphQL API query.
The queries are defined in `GITHUB_API_QUERIES`, all parameters should be passed as kwargs. The queries are defined in `GITHUB_API_QUERIES`, all parameters should be passed as kwargs.
@@ -295,15 +298,16 @@ class DownloadManager:
Merges paginated sub-queries if pagination is required for the query. Merges paginated sub-queries if pagination is required for the query.
Parse and return response as JSON. Parse and return response as JSON.
:param query: Dynamic query identifier. :param query: Dynamic query identifier.
:param use_github_action: Use GitHub actions bot auth token instead of current user.
:param kwargs: Parameters for substitution of variables in dynamic query. :param kwargs: Parameters for substitution of variables in dynamic query.
:return: Response JSON dictionary. :return: Response JSON dictionary.
""" """
key = f"{query}_{md5(dumps(kwargs, sort_keys=True).encode('utf-8')).digest()}" key = f"{query}_{md5(dumps(kwargs, sort_keys=True).encode('utf-8')).digest()}"
if key not in DownloadManager._REMOTE_RESOURCES_CACHE: if key not in DownloadManager._REMOTE_RESOURCES_CACHE:
if "$pagination" in GITHUB_API_QUERIES[query]: if "$pagination" in GITHUB_API_QUERIES[query]:
res = await DownloadManager._fetch_graphql_paginated(query, **kwargs) res = await DownloadManager._fetch_graphql_paginated(query, use_github_action, **kwargs)
else: else:
res = await DownloadManager._fetch_graphql_query(query, **kwargs) res = await DownloadManager._fetch_graphql_query(query, use_github_action, **kwargs)
DownloadManager._REMOTE_RESOURCES_CACHE[key] = res DownloadManager._REMOTE_RESOURCES_CACHE[key] = res
else: else:
res = DownloadManager._REMOTE_RESOURCES_CACHE[key] res = DownloadManager._REMOTE_RESOURCES_CACHE[key]

View File

@@ -46,4 +46,6 @@ class EnvironmentManager:
DEBUG_LOGGING = getenv("INPUT_DEBUG_LOGGING", "0").lower() in _TRUTHY DEBUG_LOGGING = getenv("INPUT_DEBUG_LOGGING", "0").lower() in _TRUTHY
DEBUG_RUN = getenv("DEBUG_RUN", "False").lower() in _TRUTHY DEBUG_RUN = getenv("DEBUG_RUN", "False").lower() in _TRUTHY
PR_NUMBER = int(getenv("PR_NUMBER", "0")) PR_NUMBER = int(getenv("PR_NUMBER", "0"))
CURRENT_GITHUB_ACTION_TOKEN = getenv("CURRENT_GITHUB_ACTION_TOKEN", "")

View File

@@ -18,7 +18,6 @@ def init_github_manager():
class GitHubManager: class GitHubManager:
_GITHUB: Github
USER: AuthenticatedUser USER: AuthenticatedUser
REPO: Repository REPO: Repository
_README: ContentFile _README: ContentFile
@@ -37,9 +36,9 @@ class GitHubManager:
- README.md file of this repo. - README.md file of this repo.
- Parsed contents of the file. - Parsed contents of the file.
""" """
GitHubManager._GITHUB = Github(EM.GH_TOKEN) github = Github(EM.GH_TOKEN)
GitHubManager.USER = GitHubManager._GITHUB.get_user() GitHubManager.USER = github.get_user()
GitHubManager.REPO = GitHubManager._GITHUB.get_repo(f"{GitHubManager.USER.login}/{GitHubManager.USER.login}") GitHubManager.REPO = github.get_repo(f"{GitHubManager.USER.login}/{GitHubManager.USER.login}")
GitHubManager._README = GitHubManager.REPO.get_readme() GitHubManager._README = GitHubManager.REPO.get_readme()
GitHubManager._README_CONTENTS = str(b64decode(GitHubManager._README.content), "utf-8") GitHubManager._README_CONTENTS = str(b64decode(GitHubManager._README.content), "utf-8")
@@ -113,9 +112,10 @@ class GitHubManager:
prefix = "README stats current output:" prefix = "README stats current output:"
DBM.i("Commenting PR...") DBM.i("Commenting PR...")
pull_request = GitHubManager._GITHUB.get_repo("anmol098/waka-readme-stats").get_pull(EM.PR_NUMBER) github = Github(EM.CURRENT_GITHUB_ACTION_TOKEN)
pull_request = github.get_repo("anmol098/waka-readme-stats").get_pull(EM.PR_NUMBER)
for comment in [ic for ic in pull_request.get_issue_comments() if ic.body.startswith(prefix)]: for comment in [ic for ic in pull_request.get_issue_comments() if ic.body.startswith(prefix)]:
await DM.get_remote_graphql("hide_outdated_comment", id=comment.id) await DM.get_remote_graphql("hide_outdated_comment", use_github_action=True, id=comment.id)
pull_request.create_issue_comment(f"{prefix}\n\n{stats}") pull_request.create_issue_comment(f"{prefix}\n\n{stats}")
DBM.g("PR commented!") DBM.g("PR commented!")