Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(861)

Unified Diff: reviewbot/rietveld.py

Issue 20495003: Implement interface to Rietveld. (Closed) Base URL: https://src.chromium.org/chrome/trunk/tools/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: reviewbot/rietveld.py
===================================================================
--- reviewbot/rietveld.py (revision 0)
+++ reviewbot/rietveld.py (revision 0)
@@ -0,0 +1,79 @@
+# 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."""
agable 2013/08/02 16:35:35 include explicit 'pass' here.
Mattias Nissler (ping if slow) 2013/08/05 09:08:51 Done.
+
+
+class Rietveld(object):
+ 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 post_comment(self, issue, comment, submit_inline_comments = False):
+ publish_payload = {
+ 'message_only': 0 if submit_inline_comments else 1,
+ 'send_mail': 1,
+ 'add_as_reviewer': 0,
+ 'message': comment,
+ 'no_redirect': 1,
+ }
+ self.post_issue_data(issue, 'publish', publish_payload)
+
+ def add_inline_comment(self, issue_id, patchset_id, patch_id, line, a_or_b,
agable 2013/08/02 16:35:35 How necessary is a_or_b? Though we haven't seen th
Mattias Nissler (ping if slow) 2013/08/05 09:08:51 a_or_b determines whether the comment appears on t
+ 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)
Property changes on: reviewbot/rietveld.py
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698