def extract_pull_request_reviews( pull_request: GithubPullRequest) -> Dict[str, Dict[str, Any]]: """Extract required features for each review from PR. Arguments: pull_request {PullRequest} -- Pull Request from which the reviews will be extracted Returns: Dict[str, Dict[str, Any]] -- dictionary of extracted reviews. Each review is stored """ reviews = pull_request.get_reviews() _LOGGER.debug(" -num of reviews found: %d" % reviews.totalCount) results = {} for idx, review in enumerate(reviews, 1): _LOGGER.info(" -analysing review no. %d/%d" % (idx, reviews.totalCount)) results[str(review.id)] = { "author": review.user.login if review.user and review.user.login else None, "words_count": len(review.body.split(" ")), "submitted_at": int(review.submitted_at.timestamp()), "state": review.state, } return results
def can_merge_pull_request(repo: Repository, pull: PullRequest) -> bool: if pull.user.login not in USER_WHITELIST: return False if pull.mergeable_state != "clean": return False if not any(label.name == AUTO_MERGE_LABEL for label in pull.labels): return False if not any(review.state == "APPROVED" for review in pull.get_reviews()): return False return True head_commit = repo.get_commit(pull.head.sha) circle_success = False percy_success = False for status in head_commit.get_statuses(): if status.state == "success": if status.context == "ci/circleci: build": circle_success = True elif status.context == "percy/web": percy_success = True return circle_success and percy_success
def convert_pr(pr: PullRequest) -> GprrPR: """ Converts PyGithub pull request representation to GPRR pull request representation :param pr: PyGithub pull request :return: GPRR pull request """ gprr_pr = GprrPR() gprr_pr.id = pr.id gprr_pr.number = pr.number gprr_pr.url = pr.html_url gprr_pr.repository = convert_repo(pr.head.repo) gprr_pr.title = pr.title gprr_pr.creator = convert_user(pr.user) gprr_pr.created = pr.created_at gprr_pr.updated = pr.updated_at gprr_pr.since_updated = (datetime.today() - gprr_pr.updated).days gprr_pr.flags.append(GprrPrFlag("Draft", str(pr.draft))) gprr_pr.flags.append(GprrPrFlag("Mergeable", str(pr.mergeable))) gprr_pr.flags.append(GprrPrFlag("Mergeable State", str(pr.mergeable_state))) gprr_pr.initial_branch = pr.head.ref for assignee in pr.assignees: gprr_pr.assignees.append(convert_user(assignee)) for label in pr.get_labels( ): # this makes additional call to Github REST API gprr_pr.labels.append(convert_label(label)) active_reviewers = [] for review in pr.get_reviews( ): # this makes additional call to Github REST API reviewer = convert_user(review.user) if not known_review(active_reviewers, reviewer): active_reviewers.append(reviewer) gprr_review = GprrReview( user=reviewer, state=review.state, submitted_at=review.submitted_at, url=review.html_url, ) gprr_pr.reviews.append(gprr_review) pr_review_requests = pr.get_review_requests() for revusr in pr_review_requests[ 0]: # this makes additional call to Github REST API usr = convert_user(revusr) review = GprrReview(user=usr, state="PENDING") gprr_pr.reviews_pending.append(review) # for revteam in pr_review_requests[1]: # team_as_user = convert_team_to_user(revteam) # review = GprrReview(user=team_as_user, state="PENDING") # gprr_pr.reviews_pending.append(review) return gprr_pr
def _get_approved_reviews(pull: PullRequest) -> List[dict]: """ Get a list of the approved reviews :param pull: :return: """ return [{ "username": r.user.login, "state": r.state } for r in pull.get_reviews() if r.state == "APPROVED"]
def get_reviews(repo_full_name): gh = get_gh_client() ghdb = get_github_db() search_for = { 'base.repo.full_name': repo_full_name, } for page in get_next_page(ghdb.pulls.find(search_for)): for raw_pull in page: pull = PullRequest(gh._Github__requester, {}, raw_pull, completed=True) for review in pull.get_reviews(): store_document(review._rawData) wait_for_rate(review)
def get_my_review(me, pr: PullRequest): for review in pr.get_reviews().reversed: if review.user.login == me.login: return review