| Index: reviewbot/rietveld.py
|
| ===================================================================
|
| --- reviewbot/rietveld.py (revision 221173)
|
| +++ reviewbot/rietveld.py (working copy)
|
| @@ -1,94 +0,0 @@
|
| -# Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -from oauth2client.client import SignedJwtAssertionCredentials
|
| -import httplib2
|
| -import model.app_config
|
| -import urllib
|
| -import util
|
| -
|
| -
|
| -EMAIL_SCOPE = 'https://www.googleapis.com/auth/userinfo.email'
|
| -
|
| -
|
| -class RietveldRequestError(Exception):
|
| - """Raised on request errors."""
|
| - pass
|
| -
|
| -
|
| -class Rietveld(object):
|
| - """Implements a Python API to access rietveld via HTTP.
|
| -
|
| - Authentication is handled via an OAuth2 access token minted from an RSA key
|
| - associated with a service account (which can be created via the Google API
|
| - console). For this to work, the Rietveld instance to talk to must be
|
| - configured to allow the service account client ID as OAuth2 audience (see
|
| - Rietveld source). Both the RSA key and the server URL are provided via static
|
| - application configuration.
|
| - """
|
| -
|
| - def __init__(self):
|
| - self.app_config = model.app_config.get()
|
| -
|
| - @util.lazy_property
|
| - def http(self):
|
| - http = httplib2.Http()
|
| -
|
| - creds = SignedJwtAssertionCredentials(self.app_config.client_id,
|
| - self.app_config.service_account_key,
|
| - EMAIL_SCOPE)
|
| - creds.authorize(http)
|
| - return http
|
| -
|
| - @util.lazy_property
|
| - def xsrf_token(self):
|
| - return self.make_request('xsrf_token',
|
| - headers={'X-Requesting-XSRF-Token': 1})
|
| -
|
| - def make_request(self, req, *args, **kwargs):
|
| - resp, response = self.http.request(
|
| - '%s/%s' % (self.app_config.server_url, req), *args, **kwargs)
|
| - if resp.status != 200:
|
| - raise RietveldRequestError(
|
| - 'Rietveld %s request failed: %s\n%s' %
|
| - (req, resp.status, str(resp)), resp, response)
|
| -
|
| - return response
|
| -
|
| - def post_data(self, req, payload=None):
|
| - actual_payload = dict(payload or {})
|
| - actual_payload['xsrf_token'] = self.xsrf_token
|
| -
|
| - return self.make_request(req, method='POST',
|
| - body=urllib.urlencode(actual_payload))
|
| -
|
| - def post_issue_data(self, issue, req, payload):
|
| - return self.post_data('%s/%s' % (issue, req), payload)
|
| -
|
| - def publish_inline_comments(self, issue, comment, reviewers, cc,
|
| - subject=None, send_mail=False):
|
| - publish_payload = {
|
| - 'cc': cc,
|
| - 'message': comment,
|
| - 'message_only': 0,
|
| - 'no_redirect': 1,
|
| - 'reviewers': reviewers,
|
| - 'send_mail': 1 if send_mail else 0,
|
| - }
|
| - if subject is not None:
|
| - publish_payload['subject'] = subject
|
| - self.post_issue_data(issue, 'publish', publish_payload)
|
| -
|
| - def add_inline_comment(self, issue_id, patchset_id, patch_id, line, a_or_b,
|
| - comment):
|
| - comment_payload = {
|
| - 'snapshot': 'old' if a_or_b is 'a' else 'new',
|
| - 'lineno': line,
|
| - 'side': a_or_b,
|
| - 'issue': issue_id,
|
| - 'patchset': patchset_id,
|
| - 'patch': patch_id,
|
| - 'text': comment,
|
| - }
|
| - self.post_data('inline_draft', comment_payload)
|
|
|