)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":11,"context_line":"consumer entities."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ib9d0b223f202a7e33cbad1602da5be7479cd3284"},{"line_number":14,"context_line":"implements: bp add-oauth-support"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAXH%2F%2FQRM%3D","line":14,"updated":"2014-04-23 01:01:15.000000000","message":"Add a DocImpact","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"}],"keystoneclient/tests/v3/test_oauth1.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":23,"context_line":"try:"},{"line_number":24,"context_line":"    from oauthlib import oauth1"},{"line_number":25,"context_line":"except ImportError:"},{"line_number":26,"context_line":"    oauth1 \u003d None"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BaseTest(utils.TestCase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPMg%3D","line":26,"updated":"2014-04-23 07:13:34.000000000","message":"I\u0027m mostly concerned with the handling of oauthlib, so as to not break clients when upgrading","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return kwargs"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @httpretty.activate"},{"line_number":51,"context_line":"    def test_description_is_optional(self, **kwargs):"},{"line_number":52,"context_line":"        consumer_id \u003d uuid.uuid4().hex"},{"line_number":53,"context_line":"        resp_ref \u003d {\u0027consumer\u0027: {\u0027description\u0027: None,"},{"line_number":54,"context_line":"                                 \u0027id\u0027: consumer_id}}"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQOY%3D","line":51,"updated":"2014-04-23 01:01:15.000000000","message":"kwargs isn\u0027t used.","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return kwargs"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @httpretty.activate"},{"line_number":51,"context_line":"    def test_description_is_optional(self, **kwargs):"},{"line_number":52,"context_line":"        consumer_id \u003d uuid.uuid4().hex"},{"line_number":53,"context_line":"        resp_ref \u003d {\u0027consumer\u0027: {\u0027description\u0027: None,"},{"line_number":54,"context_line":"                                 \u0027id\u0027: consumer_id}}"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPRk%3D","line":51,"in_reply_to":"AAAAXH%2F%2FQOY%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    def test_description_is_optional(self, **kwargs):"},{"line_number":52,"context_line":"        consumer_id \u003d uuid.uuid4().hex"},{"line_number":53,"context_line":"        resp_ref \u003d {\u0027consumer\u0027: {\u0027description\u0027: None,"},{"line_number":54,"context_line":"                                 \u0027id\u0027: consumer_id}}"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self.stub_url(httpretty.POST,"},{"line_number":57,"context_line":"                      [self.path_prefix, self.collection_key],"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQO4%3D","line":54,"updated":"2014-04-23 01:01:15.000000000","message":"there should also be a test where description isn\u0027t in the response, e.g., \n\n resp_ref \u003d {\u0027consumer\u0027: {\u0027id\u0027: consumer_id}}","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    def test_description_is_optional(self, **kwargs):"},{"line_number":52,"context_line":"        consumer_id \u003d uuid.uuid4().hex"},{"line_number":53,"context_line":"        resp_ref \u003d {\u0027consumer\u0027: {\u0027description\u0027: None,"},{"line_number":54,"context_line":"                                 \u0027id\u0027: consumer_id}}"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self.stub_url(httpretty.POST,"},{"line_number":57,"context_line":"                      [self.path_prefix, self.collection_key],"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPRA%3D","line":54,"in_reply_to":"AAAAXH%2F%2FQO4%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self.stub_url(httpretty.POST,"},{"line_number":57,"context_line":"                      [self.path_prefix, self.collection_key],"},{"line_number":58,"context_line":"                      status\u003d200, json\u003dresp_ref)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        consumer \u003d self.manager.create()"},{"line_number":61,"context_line":"        self.assertIsNone(consumer.description)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQNw%3D","line":58,"updated":"2014-04-23 01:01:15.000000000","message":"POST /OS-OAUTH1/consumers is supposed to return a 201 Created, not 200 OK.","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self.stub_url(httpretty.POST,"},{"line_number":57,"context_line":"                      [self.path_prefix, self.collection_key],"},{"line_number":58,"context_line":"                      status\u003d200, json\u003dresp_ref)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        consumer \u003d self.manager.create()"},{"line_number":61,"context_line":"        self.assertIsNone(consumer.description)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPRc%3D","line":58,"in_reply_to":"AAAAXH%2F%2FQNw%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def _new_oauth_token_with_expires_at(self):"},{"line_number":72,"context_line":"        key \u003d uuid.uuid4().hex"},{"line_number":73,"context_line":"        secret \u003d uuid.uuid4().hex"},{"line_number":74,"context_line":"        expires_at \u003d uuid.uuid4().hex"},{"line_number":75,"context_line":"        token \u003d (\u0027oauth_token\u003d%s\u0026oauth_token_secret\u003d%s\u0027"},{"line_number":76,"context_line":"                 \u0027\u0026oauth_expires_at\u003d%s\u0027 % (key, secret, expires_at))"},{"line_number":77,"context_line":"        return (key, secret, expires_at, token)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQLw%3D","line":74,"updated":"2014-04-23 01:01:15.000000000","message":"isn\u0027t this supposed to be a timestamp?","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        key \u003d uuid.uuid4().hex"},{"line_number":73,"context_line":"        secret \u003d uuid.uuid4().hex"},{"line_number":74,"context_line":"        expires_at \u003d uuid.uuid4().hex"},{"line_number":75,"context_line":"        token \u003d (\u0027oauth_token\u003d%s\u0026oauth_token_secret\u003d%s\u0027"},{"line_number":76,"context_line":"                 \u0027\u0026oauth_expires_at\u003d%s\u0027 % (key, secret, expires_at))"},{"line_number":77,"context_line":"        return (key, secret, expires_at, token)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQLg%3D","line":75,"updated":"2014-04-23 01:01:15.000000000","message":"suggest call _new_oauth_token for the common parts rather than copy-paste the code.","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        key \u003d uuid.uuid4().hex"},{"line_number":73,"context_line":"        secret \u003d uuid.uuid4().hex"},{"line_number":74,"context_line":"        expires_at \u003d uuid.uuid4().hex"},{"line_number":75,"context_line":"        token \u003d (\u0027oauth_token\u003d%s\u0026oauth_token_secret\u003d%s\u0027"},{"line_number":76,"context_line":"                 \u0027\u0026oauth_expires_at\u003d%s\u0027 % (key, secret, expires_at))"},{"line_number":77,"context_line":"        return (key, secret, expires_at, token)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FO44%3D","line":75,"in_reply_to":"AAAAXH%2F%2FQLg%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                 \u0027\u0026oauth_expires_at\u003d%s\u0027 % (key, secret, expires_at))"},{"line_number":77,"context_line":"        return (key, secret, expires_at, token)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _validate_oauth_headers(self, auth_header, oc):"},{"line_number":80,"context_line":"        self.assertTrue(auth_header.startswith(\u0027OAuth \u0027))"},{"line_number":81,"context_line":"        auth_header \u003d auth_header[6:]"},{"line_number":82,"context_line":"        header_params \u003d oc.get_oauth_params()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQJ0%3D","line":79,"updated":"2014-04-23 01:01:15.000000000","message":"oc is orange county? ontario, canada?","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                 \u0027\u0026oauth_expires_at\u003d%s\u0027 % (key, secret, expires_at))"},{"line_number":77,"context_line":"        return (key, secret, expires_at, token)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _validate_oauth_headers(self, auth_header, oc):"},{"line_number":80,"context_line":"        self.assertTrue(auth_header.startswith(\u0027OAuth \u0027))"},{"line_number":81,"context_line":"        auth_header \u003d auth_header[6:]"},{"line_number":82,"context_line":"        header_params \u003d oc.get_oauth_params()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPQY%3D","line":79,"in_reply_to":"AAAAXH%2F%2FQJ0%3D","updated":"2014-04-23 07:13:34.000000000","message":"it should be oauth_client, instead of overloading the client term","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return (key, secret, expires_at, token)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _validate_oauth_headers(self, auth_header, oc):"},{"line_number":80,"context_line":"        self.assertTrue(auth_header.startswith(\u0027OAuth \u0027))"},{"line_number":81,"context_line":"        auth_header \u003d auth_header[6:]"},{"line_number":82,"context_line":"        header_params \u003d oc.get_oauth_params()"},{"line_number":83,"context_line":"        parameters \u003d dict(header_params)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQKs%3D","line":80,"updated":"2014-04-23 01:01:15.000000000","message":"suggest use StartsWith matcher so it prints out a nicer message...\n\n self.assertThat(auth_header, matchers.StartsWith(\u0027OAuth \u0027))\n\nhttp://testtools.readthedocs.org/en/latest/for-test-authors.html#startswith-endswith","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return (key, secret, expires_at, token)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _validate_oauth_headers(self, auth_header, oc):"},{"line_number":80,"context_line":"        self.assertTrue(auth_header.startswith(\u0027OAuth \u0027))"},{"line_number":81,"context_line":"        auth_header \u003d auth_header[6:]"},{"line_number":82,"context_line":"        header_params \u003d oc.get_oauth_params()"},{"line_number":83,"context_line":"        parameters \u003d dict(header_params)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPQ0%3D","line":80,"in_reply_to":"AAAAXH%2F%2FQKs%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _validate_oauth_headers(self, auth_header, oc):"},{"line_number":80,"context_line":"        self.assertTrue(auth_header.startswith(\u0027OAuth \u0027))"},{"line_number":81,"context_line":"        auth_header \u003d auth_header[6:]"},{"line_number":82,"context_line":"        header_params \u003d oc.get_oauth_params()"},{"line_number":83,"context_line":"        parameters \u003d dict(header_params)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQLc%3D","line":81,"updated":"2014-04-23 01:01:15.000000000","message":"suggest use len(\u0027OAuth \u0027) rather than magic number 6.","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _validate_oauth_headers(self, auth_header, oc):"},{"line_number":80,"context_line":"        self.assertTrue(auth_header.startswith(\u0027OAuth \u0027))"},{"line_number":81,"context_line":"        auth_header \u003d auth_header[6:]"},{"line_number":82,"context_line":"        header_params \u003d oc.get_oauth_params()"},{"line_number":83,"context_line":"        parameters \u003d dict(header_params)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPQg%3D","line":81,"in_reply_to":"AAAAXH%2F%2FQLc%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        header_params \u003d oc.get_oauth_params()"},{"line_number":83,"context_line":"        parameters \u003d dict(header_params)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.assertEqual(parameters[\u0027oauth_signature_method\u0027], \u0027HMAC-SHA1\u0027)"},{"line_number":86,"context_line":"        self.assertEqual(parameters[\u0027oauth_version\u0027], \u00271.0\u0027)"},{"line_number":87,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_nonce\u0027])"},{"line_number":88,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_timestamp\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQKc%3D","line":85,"updated":"2014-04-23 01:01:15.000000000","message":"(nit) the order of arguments to assertEqual is expected, observed","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        header_params \u003d oc.get_oauth_params()"},{"line_number":83,"context_line":"        parameters \u003d dict(header_params)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.assertEqual(parameters[\u0027oauth_signature_method\u0027], \u0027HMAC-SHA1\u0027)"},{"line_number":86,"context_line":"        self.assertEqual(parameters[\u0027oauth_version\u0027], \u00271.0\u0027)"},{"line_number":87,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_nonce\u0027])"},{"line_number":88,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_timestamp\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPQM%3D","line":85,"in_reply_to":"AAAAXH%2F%2FQKc%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.assertEqual(parameters[\u0027oauth_signature_method\u0027], \u0027HMAC-SHA1\u0027)"},{"line_number":86,"context_line":"        self.assertEqual(parameters[\u0027oauth_version\u0027], \u00271.0\u0027)"},{"line_number":87,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_nonce\u0027])"},{"line_number":88,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_timestamp\u0027])"},{"line_number":89,"context_line":"        self.assertEqual(parameters[\u0027oauth_consumer_key\u0027], oc.client_key)"},{"line_number":90,"context_line":"        if oc.resource_owner_key:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQKY%3D","line":87,"updated":"2014-04-23 01:01:15.000000000","message":"can we at least assert that it\u0027s a string?","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.assertEqual(parameters[\u0027oauth_signature_method\u0027], \u0027HMAC-SHA1\u0027)"},{"line_number":86,"context_line":"        self.assertEqual(parameters[\u0027oauth_version\u0027], \u00271.0\u0027)"},{"line_number":87,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_nonce\u0027])"},{"line_number":88,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_timestamp\u0027])"},{"line_number":89,"context_line":"        self.assertEqual(parameters[\u0027oauth_consumer_key\u0027], oc.client_key)"},{"line_number":90,"context_line":"        if oc.resource_owner_key:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPQI%3D","line":87,"in_reply_to":"AAAAXH%2F%2FQKY%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.assertEqual(parameters[\u0027oauth_signature_method\u0027], \u0027HMAC-SHA1\u0027)"},{"line_number":86,"context_line":"        self.assertEqual(parameters[\u0027oauth_version\u0027], \u00271.0\u0027)"},{"line_number":87,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_nonce\u0027])"},{"line_number":88,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_timestamp\u0027])"},{"line_number":89,"context_line":"        self.assertEqual(parameters[\u0027oauth_consumer_key\u0027], oc.client_key)"},{"line_number":90,"context_line":"        if oc.resource_owner_key:"},{"line_number":91,"context_line":"            self.assertEqual(parameters[\u0027oauth_token\u0027], oc.resource_owner_key)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQKM%3D","line":88,"updated":"2014-04-23 01:01:15.000000000","message":"can we at least assert that it\u0027s a timestamp?","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.assertEqual(parameters[\u0027oauth_signature_method\u0027], \u0027HMAC-SHA1\u0027)"},{"line_number":86,"context_line":"        self.assertEqual(parameters[\u0027oauth_version\u0027], \u00271.0\u0027)"},{"line_number":87,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_nonce\u0027])"},{"line_number":88,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_timestamp\u0027])"},{"line_number":89,"context_line":"        self.assertEqual(parameters[\u0027oauth_consumer_key\u0027], oc.client_key)"},{"line_number":90,"context_line":"        if oc.resource_owner_key:"},{"line_number":91,"context_line":"            self.assertEqual(parameters[\u0027oauth_token\u0027], oc.resource_owner_key)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FOo0%3D","line":88,"in_reply_to":"AAAAXH%2F%2FQKM%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        request_key \u003d uuid.uuid4().hex"},{"line_number":107,"context_line":"        verifier \u003d uuid.uuid4().hex"},{"line_number":108,"context_line":"        resp_ref \u003d {\u0027token\u0027: {\u0027oauth_verifier\u0027: verifier}}"},{"line_number":109,"context_line":"        role_ids \u003d uuid.uuid4().hex"},{"line_number":110,"context_line":"        exp_body \u003d {\u0027roles\u0027: [{\u0027id\u0027: role_ids}]}"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.stub_url(httpretty.PUT,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQFE%3D","line":109,"updated":"2014-04-23 01:01:15.000000000","message":"change role_ids to role_id since there\u0027s only one.","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        request_key \u003d uuid.uuid4().hex"},{"line_number":107,"context_line":"        verifier \u003d uuid.uuid4().hex"},{"line_number":108,"context_line":"        resp_ref \u003d {\u0027token\u0027: {\u0027oauth_verifier\u0027: verifier}}"},{"line_number":109,"context_line":"        role_ids \u003d uuid.uuid4().hex"},{"line_number":110,"context_line":"        exp_body \u003d {\u0027roles\u0027: [{\u0027id\u0027: role_ids}]}"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.stub_url(httpretty.PUT,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPPc%3D","line":109,"in_reply_to":"AAAAXH%2F%2FQFE%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        verifier \u003d uuid.uuid4().hex"},{"line_number":108,"context_line":"        resp_ref \u003d {\u0027token\u0027: {\u0027oauth_verifier\u0027: verifier}}"},{"line_number":109,"context_line":"        role_ids \u003d uuid.uuid4().hex"},{"line_number":110,"context_line":"        exp_body \u003d {\u0027roles\u0027: [{\u0027id\u0027: role_ids}]}"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.stub_url(httpretty.PUT,"},{"line_number":113,"context_line":"                      [self.path_prefix, \u0027authorize\u0027, request_key],"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQE8%3D","line":110,"updated":"2014-04-23 01:01:15.000000000","message":"suggest move this down to where it\u0027s used.","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        verifier \u003d uuid.uuid4().hex"},{"line_number":108,"context_line":"        resp_ref \u003d {\u0027token\u0027: {\u0027oauth_verifier\u0027: verifier}}"},{"line_number":109,"context_line":"        role_ids \u003d uuid.uuid4().hex"},{"line_number":110,"context_line":"        exp_body \u003d {\u0027roles\u0027: [{\u0027id\u0027: role_ids}]}"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.stub_url(httpretty.PUT,"},{"line_number":113,"context_line":"                      [self.path_prefix, \u0027authorize\u0027, request_key],"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPPY%3D","line":110,"in_reply_to":"AAAAXH%2F%2FQE8%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        request_key, request_secret, resp_ref \u003d self._new_oauth_token()"},{"line_number":130,"context_line":"        self.stub_url(httpretty.POST, [self.path_prefix, \u0027request_token\u0027],"},{"line_number":131,"context_line":"                      status\u003d201, json\u003dresp_ref)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        # Assert the manager is returning request token object"},{"line_number":134,"context_line":"        request_token \u003d self.manager.create(consumer_key, consumer_secret,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQFM%3D","line":131,"updated":"2014-04-23 01:01:15.000000000","message":"resp_ref looks like it\u0027s x-www-form-urlencoded and not JSON -- http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        request_key, request_secret, resp_ref \u003d self._new_oauth_token()"},{"line_number":130,"context_line":"        self.stub_url(httpretty.POST, [self.path_prefix, \u0027request_token\u0027],"},{"line_number":131,"context_line":"                      status\u003d201, json\u003dresp_ref)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        # Assert the manager is returning request token object"},{"line_number":134,"context_line":"        request_token \u003d self.manager.create(consumer_key, consumer_secret,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FO1s%3D","line":131,"in_reply_to":"AAAAXH%2F%2FQFM%3D","updated":"2014-04-23 07:13:34.000000000","message":"replaced with:\nbody\u003dresp_ref, content_type\u003d\u0027application/x-www-form-urlencoded\u0027)","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        self.assertRequestHeaderEqual(\u0027requested_project_id\u0027, project_id)"},{"line_number":142,"context_line":"        req_headers \u003d httpretty.last_request().headers"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # Assert that the headers have the same oauthlib data"},{"line_number":145,"context_line":"        oc \u003d oauth1.Client(consumer_key, client_secret\u003dconsumer_secret,"},{"line_number":146,"context_line":"                           signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":147,"context_line":"                           callback_uri\u003d\"oob\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQI8%3D","line":144,"updated":"2014-04-23 01:01:15.000000000","message":"this would make a good docstring for _validate_oauth_headers","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        self.assertRequestHeaderEqual(\u0027requested_project_id\u0027, project_id)"},{"line_number":142,"context_line":"        req_headers \u003d httpretty.last_request().headers"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        # Assert that the headers have the same oauthlib data"},{"line_number":145,"context_line":"        oc \u003d oauth1.Client(consumer_key, client_secret\u003dconsumer_secret,"},{"line_number":146,"context_line":"                           signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":147,"context_line":"                           callback_uri\u003d\"oob\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPNw%3D","line":144,"in_reply_to":"AAAAXH%2F%2FQI8%3D","updated":"2014-04-23 07:13:34.000000000","message":"Done","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3dcb6d193a6b2624857557e9b9bc89df99d03c56","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        # Assert that the headers have the same oauthlib data"},{"line_number":145,"context_line":"        oc \u003d oauth1.Client(consumer_key, client_secret\u003dconsumer_secret,"},{"line_number":146,"context_line":"                           signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":147,"context_line":"                           callback_uri\u003d\"oob\")"},{"line_number":148,"context_line":"        self._validate_oauth_headers(req_headers[\u0027Authorization\u0027], oc)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FQGk%3D","line":147,"updated":"2014-04-23 01:01:15.000000000","message":"is callback_uri required? It\u0027s not validated in _validate_oauth_headers","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        # Assert that the headers have the same oauthlib data"},{"line_number":145,"context_line":"        oc \u003d oauth1.Client(consumer_key, client_secret\u003dconsumer_secret,"},{"line_number":146,"context_line":"                           signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":147,"context_line":"                           callback_uri\u003d\"oob\")"},{"line_number":148,"context_line":"        self._validate_oauth_headers(req_headers[\u0027Authorization\u0027], oc)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FO4s%3D","line":147,"in_reply_to":"AAAAXH%2F%2FQGk%3D","updated":"2014-04-23 07:13:34.000000000","message":"good call, i added that to validate_oauth_headers","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4bbd266a5707622ad3c6b6f91adc1280f0a4cc31","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                                           verifier)"},{"line_number":175,"context_line":"        self.assertIsInstance(access_token, self.model)"},{"line_number":176,"context_line":"        self.assertEqual(access_token.key, access_key)"},{"line_number":177,"context_line":"        self.assertEqual(access_token.secret, access_secret)"},{"line_number":178,"context_line":"        self.assertEqual(access_token.expires, expires_at)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        # Assert that the headers have the same oauthlib data"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FPN0%3D","line":177,"updated":"2014-04-23 07:13:34.000000000","message":"fixed the order here, too","commit_id":"98944c9ece7ecd160e6f7e2389b19c469b805725"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        request_key, request_secret, resp_ref \u003d self._new_oauth_token()"},{"line_number":157,"context_line":"        self.stub_url(httpretty.POST, [self.path_prefix, \u0027request_token\u0027],"},{"line_number":158,"context_line":"                      status\u003d201, body\u003djsonutils.dumps(resp_ref),"},{"line_number":159,"context_line":"                      content_type\u003d\u0027application/x-www-form-urlencoded\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        # Assert the manager is returning request token object"}],"source_content_type":"text/x-python","patch_set":9,"id":"facab960_1690aceb","line":158,"updated":"2014-04-28 23:54:34.000000000","message":"why jsonutils.dumps this? It\u0027s a string already.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        request_key, request_secret, resp_ref \u003d self._new_oauth_token()"},{"line_number":157,"context_line":"        self.stub_url(httpretty.POST, [self.path_prefix, \u0027request_token\u0027],"},{"line_number":158,"context_line":"                      status\u003d201, body\u003djsonutils.dumps(resp_ref),"},{"line_number":159,"context_line":"                      content_type\u003d\u0027application/x-www-form-urlencoded\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        # Assert the manager is returning request token object"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_39dd9f15","line":158,"in_reply_to":"bad4c104_f8f887c6","updated":"2014-04-30 07:13:45.000000000","message":"thanks for the explanation dstanek, i noticed that when testing it. I\u0027ll add a comment.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd68949d4e1db78e40973a5d4d781825496ca3cd","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        request_key, request_secret, resp_ref \u003d self._new_oauth_token()"},{"line_number":157,"context_line":"        self.stub_url(httpretty.POST, [self.path_prefix, \u0027request_token\u0027],"},{"line_number":158,"context_line":"                      status\u003d201, body\u003djsonutils.dumps(resp_ref),"},{"line_number":159,"context_line":"                      content_type\u003d\u0027application/x-www-form-urlencoded\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        # Assert the manager is returning request token object"}],"source_content_type":"text/x-python","patch_set":9,"id":"bad4c104_f8f887c6","line":158,"in_reply_to":"facab960_1690aceb","updated":"2014-04-29 15:28:58.000000000","message":"The server expects the body to be JSON. Even though the resp_ref is a string it is not a JSON string so when the server decodes it an Exception is raised.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        t \u003d self._new_oauth_token_with_expires_at()"},{"line_number":196,"context_line":"        access_key, access_secret, expires_at, resp_ref \u003d t"},{"line_number":197,"context_line":"        self.stub_url(httpretty.POST, [self.path_prefix, \u0027access_token\u0027],"},{"line_number":198,"context_line":"                      status\u003d201, body\u003djsonutils.dumps(resp_ref),"},{"line_number":199,"context_line":"                      content_type\u003d\u0027application/x-www-form-urlencoded\u0027)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # Assert that the manager creates an access token object"}],"source_content_type":"text/x-python","patch_set":9,"id":"facab960_f11c326d","line":198,"updated":"2014-04-28 23:54:34.000000000","message":"remove jsonutils.dumps?","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"}],"keystoneclient/v3/contrib/oauth1/__init__.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from keystoneclient.v3.contrib.oauth1.core import *  # flake8: noqa"}],"source_content_type":"text/x-python","patch_set":9,"id":"facab960_111a766e","line":13,"updated":"2014-04-28 23:54:34.000000000","message":"change this to # noqa (remove flake8)","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd68949d4e1db78e40973a5d4d781825496ca3cd","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from keystoneclient.v3.contrib.oauth1.core import *  # flake8: noqa"}],"source_content_type":"text/x-python","patch_set":9,"id":"bad4c104_b8b43ff3","line":13,"in_reply_to":"facab960_111a766e","updated":"2014-04-29 15:28:58.000000000","message":"++ Until recently I didn\u0027t know that having flake8 in there turns off checking for the entire file.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from keystoneclient.v3.contrib.oauth1.core import *  # flake8: noqa"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_19c1bb2e","line":13,"in_reply_to":"facab960_111a766e","updated":"2014-04-30 07:13:45.000000000","message":"Done","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"}],"keystoneclient/v3/contrib/oauth1/access_tokens.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"               request_secret, verifier):"},{"line_number":36,"context_line":"        # sign the request using oauthlib"},{"line_number":37,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/access_token\u0027"},{"line_number":38,"context_line":"        oauth_client \u003d oauth1.Client(consumer_key,"},{"line_number":39,"context_line":"                                     client_secret\u003dconsumer_secret,"},{"line_number":40,"context_line":"                                     resource_owner_key\u003drequest_key,"},{"line_number":41,"context_line":"                                     resource_owner_secret\u003drequest_secret,"}],"source_content_type":"text/x-python","patch_set":9,"id":"facab960_9125a6ad","line":38,"updated":"2014-04-28 23:54:34.000000000","message":"this is going to dereference None if oauthib.oauth1 isn\u0027t importable. We should have a nicer exception than that.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":35,"context_line":"               request_secret, verifier):"},{"line_number":36,"context_line":"        # sign the request using oauthlib"},{"line_number":37,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/access_token\u0027"},{"line_number":38,"context_line":"        oauth_client \u003d oauth1.Client(consumer_key,"},{"line_number":39,"context_line":"                                     client_secret\u003dconsumer_secret,"},{"line_number":40,"context_line":"                                     resource_owner_key\u003drequest_key,"},{"line_number":41,"context_line":"                                     resource_owner_secret\u003drequest_secret,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_e88522ae","line":38,"in_reply_to":"facab960_9125a6ad","updated":"2014-04-30 07:13:45.000000000","message":"using staneks suggestion, the user should get a notimplemeted error","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                                     resource_owner_secret\u003drequest_secret,"},{"line_number":42,"context_line":"                                     signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":43,"context_line":"                                     verifier\u003dverifier)"},{"line_number":44,"context_line":"        url \u003d self.client.auth_url + endpoint"},{"line_number":45,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # actually send the request"}],"source_content_type":"text/x-python","patch_set":9,"id":"dacfb570_a1125e56","line":44,"updated":"2014-04-28 23:54:34.000000000","message":"should probably remove a trailing / if self.client.auth_url has it.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                                     resource_owner_secret\u003drequest_secret,"},{"line_number":42,"context_line":"                                     signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":43,"context_line":"                                     verifier\u003dverifier)"},{"line_number":44,"context_line":"        url \u003d self.client.auth_url + endpoint"},{"line_number":45,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # actually send the request"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_39791ffd","line":44,"in_reply_to":"dacfb570_a1125e56","updated":"2014-04-30 07:13:45.000000000","message":"Done","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        url \u003d self.client.auth_url + endpoint"},{"line_number":45,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # actually send the request"},{"line_number":48,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        # returned format will be:"}],"source_content_type":"text/x-python","patch_set":9,"id":"facab960_b139cada","line":47,"updated":"2014-04-28 23:54:34.000000000","message":"remove actually, or could just remove the comment since it\u0027s pretty obvious.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        url \u003d self.client.auth_url + endpoint"},{"line_number":45,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # actually send the request"},{"line_number":48,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        # returned format will be:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_597ee3e5","line":47,"in_reply_to":"facab960_b139cada","updated":"2014-04-30 07:13:45.000000000","message":"Done","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        secret \u003d credentials[\u0027oauth_token_secret\u0027][0]"},{"line_number":56,"context_line":"        access_token \u003d {\u0027key\u0027: key, \u0027id\u0027: key, \u0027secret\u0027: secret}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        if credentials.get(\u0027oauth_expires_at\u0027):"},{"line_number":59,"context_line":"            expires \u003d credentials[\u0027oauth_expires_at\u0027][0]"},{"line_number":60,"context_line":"            access_token[\u0027expires\u0027] \u003d expires"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"dacfb570_015f8a0f","line":58,"updated":"2014-04-28 23:54:34.000000000","message":"suggest set a variable rather than get the value twice.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"}],"keystoneclient/v3/contrib/oauth1/consumers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class ConsumerManager(base.CrudManager):"},{"line_number":28,"context_line":"    \"\"\"Manager class for manipulating Identity Consumers.\"\"\""},{"line_number":29,"context_line":"    resource_class \u003d Consumer"},{"line_number":30,"context_line":"    collection_key \u003d \u0027consumers\u0027"},{"line_number":31,"context_line":"    key \u003d \u0027consumer\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"dacfb570_61a5b603","line":28,"updated":"2014-04-28 23:54:34.000000000","message":"lowercase \"identity consumers\"","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class ConsumerManager(base.CrudManager):"},{"line_number":28,"context_line":"    \"\"\"Manager class for manipulating Identity Consumers.\"\"\""},{"line_number":29,"context_line":"    resource_class \u003d Consumer"},{"line_number":30,"context_line":"    collection_key \u003d \u0027consumers\u0027"},{"line_number":31,"context_line":"    key \u003d \u0027consumer\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_b96c4f38","line":28,"in_reply_to":"dacfb570_61a5b603","updated":"2014-04-30 07:13:45.000000000","message":"Done","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"}],"keystoneclient/v3/contrib/oauth1/core.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd68949d4e1db78e40973a5d4d781825496ca3cd","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from keystoneclient.v3.contrib.oauth1 import request_tokens"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class OAuthManager(object):"},{"line_number":20,"context_line":"    def __init__(self, api):"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"        # (stevemar): Attempt to import the oauthlib package at this point"}],"source_content_type":"text/x-python","patch_set":9,"id":"bad4c104_7b5e31eb","line":19,"updated":"2014-04-29 15:28:58.000000000","message":"One thought I had for this was to have a factory function named \u0027make_oauth_manager\u0027 that is used by the client. The factory would import oauthlib and return an OAuthManager instance if it\u0027s installed or  a OAuthManagerNotImplemented instance if it\u0027s not. OAuthManagerNotImplemented would raise a NotImplemented or something when it is actually used.\n\nMy naming skills are terrible, so please don\u0027t use the names above.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from keystoneclient.v3.contrib.oauth1 import request_tokens"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class OAuthManager(object):"},{"line_number":20,"context_line":"    def __init__(self, api):"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"        # (stevemar): Attempt to import the oauthlib package at this point"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_08fc063e","line":19,"in_reply_to":"bad4c104_7b5e31eb","updated":"2014-04-30 07:13:45.000000000","message":"okay, i think i got this idea of yours working, take a look at the next patch. when I played around with it in my environment it seemed okay, made sure to try it out with oauthlib installed vs not installed, and actually try to create the client. \n\nthe result is as you expected, the client is created, and when client.oauth1.xyz is called, a NotImplementedError is raised.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7db2bd8a6e177e954865dc9e182a36a6676b640f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from keystoneclient.v3.contrib.oauth1 import request_tokens"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def create_oauth_manager(self):"},{"line_number":20,"context_line":"    # NOTE(stevemar): Attempt to import the oauthlib package at this point."},{"line_number":21,"context_line":"    try:"},{"line_number":22,"context_line":"        import oauthlib  # noqa"}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad9bd40_b031afa4","line":19,"updated":"2014-04-30 16:54:22.000000000","message":"Nice.","commit_id":"64842c8e3ae7c2ec8881fa175b0bc72e2851738b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7db2bd8a6e177e954865dc9e182a36a6676b640f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.request_tokens \u003d request_tokens.RequestTokenManager(api)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class OAuthManagerNotImplemented(NotImplementedError):"},{"line_number":37,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad9bd40_501a2318","line":36,"updated":"2014-04-30 16:54:22.000000000","message":"For this how about something like:\n\n    \u003e\u003e\u003e class OAuthManagerNotImplemented(object):\n    ...     def __getattribute__(self, name):\n    ...         if name in (\u0027access_tokens\u0027, \u0027comsumers\u0027, \u0027request_tokens\u0027):\n    ...             raise NotImplementedError(\n    ...                 \u0027To use %r oauthlib must be installed\u0027 % name)\n    ...         return super(OAuthManagerNotImplemented, self).__getattribute__(name)\n    ...\n    \u003e\u003e\u003e m \u003d OAuthManagerNotImplemented()\n    \u003e\u003e\u003e m.access_tokens.blah\n    Traceback (most recent call last):\n      File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n      File \"\u003cstdin\u003e\", line 5, in __getattribute__\n    NotImplementedError: To use \u0027access_tokens\u0027 oauthlib must be installed\n    \u003e\u003e\u003e m.access_token.blah\n    Traceback (most recent call last):\n      File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n      File \"\u003cstdin\u003e\", line 6, in __getattribute__\n    AttributeError: \u0027OAuthManagerNotImplemented\u0027 object has no attribute \u0027access_token\u0027","commit_id":"64842c8e3ae7c2ec8881fa175b0bc72e2851738b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e7d8d95e8ad533b66f488a483ca633864f635905","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.request_tokens \u003d request_tokens.RequestTokenManager(api)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class OAuthManagerNotImplemented(NotImplementedError):"},{"line_number":37,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad9bd40_50c86374","line":36,"in_reply_to":"9ad9bd40_501a2318","updated":"2014-04-30 16:56:43.000000000","message":"that is far superior. thank yee","commit_id":"64842c8e3ae7c2ec8881fa175b0bc72e2851738b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2a777e97ad0d9e6469c3c5abde8c40994a181709","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    try:"},{"line_number":22,"context_line":"        import oauthlib  # noqa"},{"line_number":23,"context_line":"    except ImportError:"},{"line_number":24,"context_line":"        return OAuthManagerNotImplemented()"},{"line_number":25,"context_line":"    else:"},{"line_number":26,"context_line":"        return OAuthManager(self)"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad9bd40_4f0410c0","line":24,"updated":"2014-05-02 17:03:03.000000000","message":"inline comment explaining why this is a return (only because the object name reads a lot like an Exception","commit_id":"2ed177e0ea875ee9575d8ef992bcb78afec7e616"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cdadc3ab45c3ddd1e9137de03278e5964af84ecb","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    try:"},{"line_number":22,"context_line":"        import oauthlib  # noqa"},{"line_number":23,"context_line":"    except ImportError:"},{"line_number":24,"context_line":"        return OAuthManagerNotImplemented()"},{"line_number":25,"context_line":"    else:"},{"line_number":26,"context_line":"        return OAuthManager(self)"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad9bd40_4a04febf","line":24,"in_reply_to":"9ad9bd40_4f0410c0","updated":"2014-05-02 19:41:22.000000000","message":"Done","commit_id":"2ed177e0ea875ee9575d8ef992bcb78afec7e616"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2a777e97ad0d9e6469c3c5abde8c40994a181709","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.request_tokens \u003d request_tokens.RequestTokenManager(api)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class OAuthManagerNotImplemented(object):"},{"line_number":37,"context_line":"    def __getattribute__(self, name):"},{"line_number":38,"context_line":"        if name in (\u0027access_tokens\u0027, \u0027comsumers\u0027, \u0027request_tokens\u0027):"},{"line_number":39,"context_line":"            raise NotImplementedError("}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad9bd40_8f5ff8e4","line":36,"updated":"2014-05-02 17:03:03.000000000","message":"docstr about how this behaves would be appreciated - took me a minute to  work out where name was coming from, etc\n\nalso, instead of NotImplemented, i\u0027d suggest OptionalImportProxy or something to better reflect the behavior","commit_id":"2ed177e0ea875ee9575d8ef992bcb78afec7e616"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cdadc3ab45c3ddd1e9137de03278e5964af84ecb","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.request_tokens \u003d request_tokens.RequestTokenManager(api)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class OAuthManagerNotImplemented(object):"},{"line_number":37,"context_line":"    def __getattribute__(self, name):"},{"line_number":38,"context_line":"        if name in (\u0027access_tokens\u0027, \u0027comsumers\u0027, \u0027request_tokens\u0027):"},{"line_number":39,"context_line":"            raise NotImplementedError("}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad9bd40_0afaf6bc","line":36,"in_reply_to":"9ad9bd40_8f5ff8e4","updated":"2014-05-02 19:41:22.000000000","message":"sure, i\u0027ll add one in","commit_id":"2ed177e0ea875ee9575d8ef992bcb78afec7e616"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"438e415fc9920ff3a78f86d256aaad726c4d6166","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    # oauth portions of client. Otherwise an exception would be raised"},{"line_number":26,"context_line":"    # when the client is created."},{"line_number":27,"context_line":"    except ImportError:"},{"line_number":28,"context_line":"        return OAuthManagerNotImplemented()"},{"line_number":29,"context_line":"    else:"},{"line_number":30,"context_line":"        return OAuthManager(self)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad9bd40_b884fbb1","line":28,"updated":"2014-05-02 19:28:41.000000000","message":"^","commit_id":"3ec03da145d749c5713d5e4e8f768f4cd5a3af8a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"438e415fc9920ff3a78f86d256aaad726c4d6166","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class OAuthManagerOptionalImportProxy(object):"},{"line_number":41,"context_line":"    \"\"\"The way this is intended to operate is as follows."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    This class will only be created if oauthlib is not in the system,"},{"line_number":44,"context_line":"    trying to access any of the attributes in name (access_tokens,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad9bd40_f8e04398","line":41,"updated":"2014-05-02 19:28:41.000000000","message":"summarize, in one line, the class\u0027 responsibility","commit_id":"3ec03da145d749c5713d5e4e8f768f4cd5a3af8a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"438e415fc9920ff3a78f86d256aaad726c4d6166","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    consumers, request_tokens), will result in a NotImplementedError,"},{"line_number":46,"context_line":"    and a message."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    \u003e\u003e\u003e m.access_tokens.blah"},{"line_number":49,"context_line":"    NotImplementedError: To use \u0027access_tokens\u0027 oauthlib must be installed"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    Otherwise, if trying to access an attribute other than the ones in name,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad9bd40_d8fc5f41","line":48,"updated":"2014-05-02 19:28:41.000000000","message":"manager?","commit_id":"3ec03da145d749c5713d5e4e8f768f4cd5a3af8a"}],"keystoneclient/v3/contrib/oauth1/request_tokens.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RequestToken(base.Resource):"},{"line_number":27,"context_line":"    def authorize(self, roles):"},{"line_number":28,"context_line":"        self.manager.authorize(self, roles)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class RequestTokenManager(base.CrudManager):"}],"source_content_type":"text/x-python","patch_set":9,"id":"facab960_5104fe14","line":28,"updated":"2014-04-28 23:54:34.000000000","message":"according to the coverage report this isn\u0027t tested.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RequestToken(base.Resource):"},{"line_number":27,"context_line":"    def authorize(self, roles):"},{"line_number":28,"context_line":"        self.manager.authorize(self, roles)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class RequestTokenManager(base.CrudManager):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_d43b9a36","line":28,"in_reply_to":"facab960_5104fe14","updated":"2014-04-30 07:13:45.000000000","message":"thanks for pointing this out, there was a bug here.\n\ni modified the test to access the resource (which in turns access the manager), rather than the manger directly.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\"Manager class for manipulating Identity OAuth Request Tokens.\"\"\""},{"line_number":33,"context_line":"    resource_class \u003d RequestToken"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def authorize(self, request_token, roles):"},{"line_number":36,"context_line":"        request_id \u003d base.getid(request_token)"},{"line_number":37,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/authorize/%s\u0027 % (request_id)"},{"line_number":38,"context_line":"        body \u003d {\u0027roles\u0027: [{\u0027id\u0027: base.getid(r_id)} for r_id in roles]}"}],"source_content_type":"text/x-python","patch_set":9,"id":"dacfb570_2182ce52","line":35,"updated":"2014-04-28 23:54:34.000000000","message":"this should have a docstring to at least explain what \"request_token\" and \"roles\" are supposed to be.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\"Manager class for manipulating Identity OAuth Request Tokens.\"\"\""},{"line_number":33,"context_line":"    resource_class \u003d RequestToken"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def authorize(self, request_token, roles):"},{"line_number":36,"context_line":"        request_id \u003d base.getid(request_token)"},{"line_number":37,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/authorize/%s\u0027 % (request_id)"},{"line_number":38,"context_line":"        body \u003d {\u0027roles\u0027: [{\u0027id\u0027: base.getid(r_id)} for r_id in roles]}"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_39183f84","line":35,"in_reply_to":"dacfb570_2182ce52","updated":"2014-04-30 07:13:45.000000000","message":"Done","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def authorize(self, request_token, roles):"},{"line_number":36,"context_line":"        request_id \u003d base.getid(request_token)"},{"line_number":37,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/authorize/%s\u0027 % (request_id)"},{"line_number":38,"context_line":"        body \u003d {\u0027roles\u0027: [{\u0027id\u0027: base.getid(r_id)} for r_id in roles]}"},{"line_number":39,"context_line":"        return self._put(endpoint, body, \"token\")"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"dacfb570_617cd673","line":37,"updated":"2014-04-28 23:54:34.000000000","message":"suggest URL-escape request_id since building a URL.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def authorize(self, request_token, roles):"},{"line_number":36,"context_line":"        request_id \u003d base.getid(request_token)"},{"line_number":37,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/authorize/%s\u0027 % (request_id)"},{"line_number":38,"context_line":"        body \u003d {\u0027roles\u0027: [{\u0027id\u0027: base.getid(r_id)} for r_id in roles]}"},{"line_number":39,"context_line":"        return self._put(endpoint, body, \"token\")"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_7409ee2b","line":37,"in_reply_to":"dacfb570_617cd673","updated":"2014-04-30 07:13:45.000000000","message":"Done","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def create(self, consumer_key, consumer_secret, project):"},{"line_number":42,"context_line":"        # sign the request using oauthlib"},{"line_number":43,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/request_token\u0027"},{"line_number":44,"context_line":"        headers \u003d {\u0027requested_project_id\u0027: base.getid(project)}"},{"line_number":45,"context_line":"        oauth_client \u003d oauth1.Client(consumer_key,"},{"line_number":46,"context_line":"                                     client_secret\u003dconsumer_secret,"}],"source_content_type":"text/x-python","patch_set":9,"id":"dacfb570_a195fe89","line":43,"updated":"2014-04-28 23:54:34.000000000","message":"OS-AUTH1 is copied a lot, suggest put it somewhere... like a build_oauth1_endpoint(*args)","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def create(self, consumer_key, consumer_secret, project):"},{"line_number":42,"context_line":"        # sign the request using oauthlib"},{"line_number":43,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/request_token\u0027"},{"line_number":44,"context_line":"        headers \u003d {\u0027requested_project_id\u0027: base.getid(project)}"},{"line_number":45,"context_line":"        oauth_client \u003d oauth1.Client(consumer_key,"},{"line_number":46,"context_line":"                                     client_secret\u003dconsumer_secret,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_f99257f5","line":43,"in_reply_to":"dacfb570_a195fe89","updated":"2014-04-30 07:13:45.000000000","message":"Done","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027,"},{"line_number":51,"context_line":"                                               headers\u003dheaders)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # actually send the request"},{"line_number":54,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        # returned format will be:"}],"source_content_type":"text/x-python","patch_set":9,"id":"dacfb570_c192029f","line":53,"updated":"2014-04-28 23:54:34.000000000","message":"remove this comment.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027,"},{"line_number":51,"context_line":"                                               headers\u003dheaders)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # actually send the request"},{"line_number":54,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        # returned format will be:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_19745bfc","line":53,"in_reply_to":"dacfb570_c192029f","updated":"2014-04-30 07:13:45.000000000","message":"Done","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        # returned format will be:"},{"line_number":57,"context_line":"        # \u0027oauth_token\u003d12345\u0026oauth_token_secret\u003d67890\u0027"},{"line_number":58,"context_line":"        # with \u0027oauth_expires_at\u0027 possibly there, too"},{"line_number":59,"context_line":"        credentials \u003d urlparse.parse_qs(body)"},{"line_number":60,"context_line":"        key \u003d credentials[\u0027oauth_token\u0027][0]"},{"line_number":61,"context_line":"        secret \u003d credentials[\u0027oauth_token_secret\u0027][0]"},{"line_number":62,"context_line":"        request_token \u003d {\u0027key\u0027: key, \u0027id\u0027: key, \u0027secret\u0027: secret}"}],"source_content_type":"text/x-python","patch_set":9,"id":"dacfb570_e18f0674","line":59,"updated":"2014-04-28 23:54:34.000000000","message":"I\u0027ve seen this code before. Suggest put it in a common place.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        # returned format will be:"},{"line_number":57,"context_line":"        # \u0027oauth_token\u003d12345\u0026oauth_token_secret\u003d67890\u0027"},{"line_number":58,"context_line":"        # with \u0027oauth_expires_at\u0027 possibly there, too"},{"line_number":59,"context_line":"        credentials \u003d urlparse.parse_qs(body)"},{"line_number":60,"context_line":"        key \u003d credentials[\u0027oauth_token\u0027][0]"},{"line_number":61,"context_line":"        secret \u003d credentials[\u0027oauth_token_secret\u0027][0]"},{"line_number":62,"context_line":"        request_token \u003d {\u0027key\u0027: key, \u0027id\u0027: key, \u0027secret\u0027: secret}"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_99a4eb58","line":59,"in_reply_to":"dacfb570_e18f0674","updated":"2014-04-30 07:13:45.000000000","message":"Done","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45d31ec5aeedb66108cfb12dde45e5052e2a5a9e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        request_token \u003d {\u0027key\u0027: key, \u0027id\u0027: key, \u0027secret\u0027: secret}"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        if credentials.get(\u0027oauth_expires_at\u0027):"},{"line_number":65,"context_line":"            expires \u003d credentials[\u0027oauth_expires_at\u0027][0]"},{"line_number":66,"context_line":"            request_token[\u0027expires\u0027] \u003d expires"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        return self.resource_class(self, request_token)"}],"source_content_type":"text/x-python","patch_set":9,"id":"facab960_b112aa56","line":65,"updated":"2014-04-28 23:54:34.000000000","message":"according to the coverage report this isn\u0027t tested.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"875f5171098d3048f397e0342ad797c5ea07f236","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        request_token \u003d {\u0027key\u0027: key, \u0027id\u0027: key, \u0027secret\u0027: secret}"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        if credentials.get(\u0027oauth_expires_at\u0027):"},{"line_number":65,"context_line":"            expires \u003d credentials[\u0027oauth_expires_at\u0027][0]"},{"line_number":66,"context_line":"            request_token[\u0027expires\u0027] \u003d expires"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        return self.resource_class(self, request_token)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_799f2704","line":65,"in_reply_to":"facab960_b112aa56","updated":"2014-04-30 07:13:45.000000000","message":"i think by making this a common function it\u0027ll get tested now.","commit_id":"cb14ba1ecb64cab4894ac442e1b30db827f7ed87"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2a777e97ad0d9e6469c3c5abde8c40994a181709","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        try:"},{"line_number":30,"context_line":"            retval \u003d self.manager.authorize(self.id, roles)"},{"line_number":31,"context_line":"            self \u003d retval"},{"line_number":32,"context_line":"        except Exception:"},{"line_number":33,"context_line":"            retval \u003d None"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        return retval"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad9bd40_3473a1e8","line":32,"updated":"2014-05-02 17:03:03.000000000","message":"can you catch something more specific, or use an inline comment to justify catching Exception?","commit_id":"2ed177e0ea875ee9575d8ef992bcb78afec7e616"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cdadc3ab45c3ddd1e9137de03278e5964af84ecb","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        try:"},{"line_number":30,"context_line":"            retval \u003d self.manager.authorize(self.id, roles)"},{"line_number":31,"context_line":"            self \u003d retval"},{"line_number":32,"context_line":"        except Exception:"},{"line_number":33,"context_line":"            retval \u003d None"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        return retval"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad9bd40_aaed8a27","line":32,"in_reply_to":"9ad9bd40_3473a1e8","updated":"2014-05-02 19:41:22.000000000","message":"existing weirdness: https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/v3/groups.py","commit_id":"2ed177e0ea875ee9575d8ef992bcb78afec7e616"}],"keystoneclient/v3/contrib/oauth1/utils.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"19f555fa52523d8012ccbabda39e1234415ea125","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    key \u003d credentials[\u0027oauth_token\u0027][0]"},{"line_number":29,"context_line":"    secret \u003d credentials[\u0027oauth_token_secret\u0027][0]"},{"line_number":30,"context_line":"    token \u003d {\u0027key\u0027: key, \u0027id\u0027: key, \u0027secret\u0027: secret}"},{"line_number":31,"context_line":"    if credentials.get(\u0027oauth_expires_at\u0027):"},{"line_number":32,"context_line":"        expires \u003d credentials[\u0027oauth_expires_at\u0027][0]"},{"line_number":33,"context_line":"        token[\u0027expires\u0027] \u003d expires"},{"line_number":34,"context_line":"    return token"}],"source_content_type":"text/x-python","patch_set":10,"id":"9ad9bd40_e821a2b5","line":31,"updated":"2014-04-30 07:16:36.000000000","message":"forgot to make oauth_expires_at a variable","commit_id":"975478cce315af2232fff441205cb44aef69c267"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b70aba3f4f93fc30f8548fbe3a2271d301c61efe","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from six.moves.urllib import parse as urlparse"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"OAUTH_PATH \u003d \u0027/OS-OAUTH1\u0027"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad9bd40_90baebdf","line":15,"updated":"2014-04-30 17:26:46.000000000","message":"Add a newline for pep8 here","commit_id":"64842c8e3ae7c2ec8881fa175b0bc72e2851738b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7748c5c5e0dedd4ac320726d9506988160f93de9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from six.moves.urllib import parse as urlparse"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"OAUTH_PATH \u003d \u0027/OS-OAUTH1\u0027"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad9bd40_898f2623","line":15,"in_reply_to":"9ad9bd40_90baebdf","updated":"2014-04-30 19:14:03.000000000","message":"Done","commit_id":"64842c8e3ae7c2ec8881fa175b0bc72e2851738b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b70aba3f4f93fc30f8548fbe3a2271d301c61efe","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    key \u003d credentials[\u0027oauth_token\u0027][0]"},{"line_number":29,"context_line":"    secret \u003d credentials[\u0027oauth_token_secret\u0027][0]"},{"line_number":30,"context_line":"    token \u003d {\u0027key\u0027: key, \u0027id\u0027: key, \u0027secret\u0027: secret}"},{"line_number":31,"context_line":"    if credentials.get(\u0027oauth_expires_at\u0027):"},{"line_number":32,"context_line":"        expires \u003d credentials[\u0027oauth_expires_at\u0027][0]"},{"line_number":33,"context_line":"        token[\u0027expires\u0027] \u003d expires"},{"line_number":34,"context_line":"    return token"}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad9bd40_d0b0f3df","line":31,"updated":"2014-04-30 17:26:46.000000000","message":"(nit) i usually prefer a containment test like \"if \u0027oauth_expires_at\u0027 in credentials\" if the return value of the .get() isn\u0027t used.","commit_id":"64842c8e3ae7c2ec8881fa175b0bc72e2851738b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7748c5c5e0dedd4ac320726d9506988160f93de9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    key \u003d credentials[\u0027oauth_token\u0027][0]"},{"line_number":29,"context_line":"    secret \u003d credentials[\u0027oauth_token_secret\u0027][0]"},{"line_number":30,"context_line":"    token \u003d {\u0027key\u0027: key, \u0027id\u0027: key, \u0027secret\u0027: secret}"},{"line_number":31,"context_line":"    if credentials.get(\u0027oauth_expires_at\u0027):"},{"line_number":32,"context_line":"        expires \u003d credentials[\u0027oauth_expires_at\u0027][0]"},{"line_number":33,"context_line":"        token[\u0027expires\u0027] \u003d expires"},{"line_number":34,"context_line":"    return token"}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad9bd40_6973c24d","line":31,"in_reply_to":"9ad9bd40_d0b0f3df","updated":"2014-04-30 19:14:03.000000000","message":"placed expires_at into it\u0027s own variable","commit_id":"64842c8e3ae7c2ec8881fa175b0bc72e2851738b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2a777e97ad0d9e6469c3c5abde8c40994a181709","unresolved":false,"context_lines":[{"line_number":17,"context_line":"OAUTH_PATH \u003d \u0027/OS-OAUTH1\u0027"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def get_token_from_body(body):"},{"line_number":21,"context_line":"    \"\"\"Parse the URL response body to retrieve the oauth token key and secret"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    The response body will look like:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad9bd40_ef7244ac","line":20,"updated":"2014-05-02 17:03:03.000000000","message":"since we have to deal with a lot of different tokens, can this be more specific?\n\n  get_oauth_token_from_body ?\n\ni know it\u0027s redundant with the module name, but \"token\" is sooo overloaded already","commit_id":"2ed177e0ea875ee9575d8ef992bcb78afec7e616"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cdadc3ab45c3ddd1e9137de03278e5964af84ecb","unresolved":false,"context_lines":[{"line_number":17,"context_line":"OAUTH_PATH \u003d \u0027/OS-OAUTH1\u0027"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def get_token_from_body(body):"},{"line_number":21,"context_line":"    \"\"\"Parse the URL response body to retrieve the oauth token key and secret"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    The response body will look like:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad9bd40_6f2b9494","line":20,"in_reply_to":"9ad9bd40_ef7244ac","updated":"2014-05-02 19:41:22.000000000","message":"totally, good call","commit_id":"2ed177e0ea875ee9575d8ef992bcb78afec7e616"}],"requirements.txt":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"07b3a4d14313297c77af59b79e6ea2b3a5e64c56","unresolved":false,"context_lines":[{"line_number":7,"context_line":"PrettyTable\u003e\u003d0.7,\u003c0.8"},{"line_number":8,"context_line":"requests\u003e\u003d1.1"},{"line_number":9,"context_line":"six\u003e\u003d1.5.2"},{"line_number":10,"context_line":"oauthlib\u003e\u003d0.6"}],"source_content_type":"text/plain","patch_set":1,"id":"AAAAWH%2F%2B6wg%3D","line":10,"updated":"2014-03-21 17:36:47.000000000","message":"This needs to be added to stable/havana\n\nSince we test trunk clients on stable branches.\n\n http://git.openstack.org/cgit/openstack/requirements/tree/global-requirements.txt?h\u003dstable/havana","commit_id":"48f271c1ece1e8b5ae49235bf1f0fba297376b18"}]}
