Exemplo n.º 1
0
    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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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"]
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
def get_my_review(me, pr: PullRequest):
    for review in pr.get_reviews().reversed:
        if review.user.login == me.login:
            return review