Source code for gerrit.changes.reviewers

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author: Jialiang Shi
import logging
import requests
from gerrit.utils.gerritbase import GerritBase
from gerrit.utils.exceptions import (
    ReviewerNotFoundError,
    ReviewerAlreadyExistsError,
    GerritAPIException,
)

logger = logging.getLogger(__name__)


[docs] class GerritChangeReviewer(GerritBase): def __init__(self, account: str, change: str, gerrit): self.account = account self.change = change self.gerrit = gerrit self.endpoint = f"/changes/{self.change}/reviewers/{self.account}" super().__init__(self) def __str__(self): return str(self.account)
[docs] def delete(self, input_=None): """ Deletes a reviewer from a change. Deleting a reviewer also removes that user from the attention set. .. code-block:: python input_ = { "notify": "NONE" } change = client.changes.get('Project~stable~I10394472cbd17dd12454f229e4f6de00b143a444') reviewer = change.reviewers.get('john.doe') reviewer.delete(input_) # or reviewer.delete() :param input_: the DeleteReviewerInput entity, https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#delete-reviewer-input :return: """ if input_ is None: self.gerrit.delete(self.endpoint) else: self.gerrit.post( self.endpoint + "/delete", json=input_, headers=self.gerrit.default_headers, )
[docs] def list_votes(self): """ Lists the votes for a specific reviewer of the change. :return: """ return self.gerrit.get(self.endpoint + "/votes/")
[docs] def delete_vote(self, label, input_=None): """ Deletes a single vote from a change. Note, that even when the last vote of a reviewer is removed the reviewer itself is still listed on the change. .. code-block:: python input_ = { "notify": "NONE" } change = client.changes.get('Project~stable~I10394472cbd17dd12454f229e4f6de00b143a444') reviewer = change.reviewers.get('john.doe') reviewer.delete_vote('Code-Review', input_) # or reviewer.delete_vote('Code-Review') :param label: :param input_: the DeleteVoteInput entity, https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#delete-vote-input :return: """ endpoint = self.endpoint + f"/votes/{label}" if input_ is None: self.gerrit.delete(endpoint) else: self.gerrit.post( endpoint + "/delete", json=input_, headers=self.gerrit.default_headers )
[docs] class GerritChangeReviewers: def __init__(self, change, gerrit): self.change = change self.gerrit = gerrit self.endpoint = f"/changes/{self.change}/reviewers"
[docs] def list(self): """ Lists the reviewers of a change. :return: """ result = self.gerrit.get(self.endpoint + "/") return result
[docs] def get(self, account): """ Retrieves a reviewer of a change. :param account: _account_id, name, username or email :return: """ try: result = self.gerrit.get(self.endpoint + f"/{account}") account = result[0].get("_account_id") return GerritChangeReviewer( account=account, change=self.change, gerrit=self.gerrit ) except requests.exceptions.HTTPError as error: if error.response.status_code == 404: message = f"Reviewer {account} does not exist" raise ReviewerNotFoundError(message) raise GerritAPIException from error
[docs] def add(self, input_): """ Adds one user or all members of one group as reviewer to the change. Users can be moved from reviewer to CC and vice versa. This means if a user is added as CC that is already a reviewer on the change, the reviewer state of that user is updated to CC. If a user that is already a CC on the change is added as reviewer, the reviewer state of that user is updated to reviewer. Adding a new reviewer also adds that reviewer to the attention set, unless the change is work in progress. Also, moving a reviewer to CC removes that user from the attention set. .. code-block:: python input_ = { "reviewer": "john.doe" } change = client.changes.get('Project~stable~I10394472cbd17dd12454f229e4f6de00b143a444') new_reviewer = change.reviewers.add(input_) :param input_: the ReviewerInput entity, https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#reviewer-input :return: """ reviewer = input_.get("reviewer") try: self.get(reviewer) message = f"Reviewer {reviewer} already exists" logger.error(message) raise ReviewerAlreadyExistsError(message) except ReviewerNotFoundError: self.gerrit.post( self.endpoint, json=input_, headers=self.gerrit.default_headers ) return self.get(reviewer)