)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ae4f5cdac9fce58e4f709a0fea6de685348e28be","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Lukas Vacek \u003clucas.vacek@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-22 18:46:15 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add optional kerberos support"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I1a47e455aa14535a124df950994718a11d7e4f57"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a8ffd7b_1ac5d85a","line":7,"updated":"2015-12-02 22:57:52.000000000","message":"It would be nice to expand the commit message some.  This is an excellent summary, but there should be a paragraph going into a bit more detail about the details of the implementation.  (Set that paragraph off from the summary with a blank line, or gerrit will think the whole description is the summary :)","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"12cf133378d16f17766e69959c581b08b06a73f3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Lukas Vacek \u003clucas.vacek@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-22 18:46:15 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add optional kerberos support"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I1a47e455aa14535a124df950994718a11d7e4f57"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a68dd71_a2e9fde7","line":7,"in_reply_to":"9a8ffd7b_1ac5d85a","updated":"2016-01-24 17:29:58.000000000","message":"Done","commit_id":"0a0339686e11359101140876c30774989b5c43af"}],"jenkins/urllib_kerb.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ae4f5cdac9fce58e4f709a0fea6de685348e28be","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# Copyright (C) 2015 OpenStack Foundation"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_7aa18493","line":1,"updated":"2015-12-02 22:57:52.000000000","message":"Eliminate the #! line and the test code at the bottom, and add appropriate unit tests to the test suite.  Also, please make sure this file is not set executable…","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"12cf133378d16f17766e69959c581b08b06a73f3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# Copyright (C) 2015 OpenStack Foundation"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_82187976","line":1,"in_reply_to":"9a8ffd7b_7aa18493","updated":"2016-01-24 17:29:58.000000000","message":"Done","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ae4f5cdac9fce58e4f709a0fea6de685348e28be","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import logging"},{"line_number":17,"context_line":"import re"},{"line_number":18,"context_line":"from six.moves.urllib.error import HTTPError"},{"line_number":19,"context_line":"from six.moves.urllib.request import BaseHandler, build_opener"},{"line_number":20,"context_line":"import kerberos"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_9ae308d8","line":18,"updated":"2015-12-02 22:57:52.000000000","message":"Openstack projects use a tripartite import style, as you can see from the imports at the top of __init__.py; the first part is imports from the standard Python library, the second part is third party imports (such as six or kerberos), and the third part is imports from the package—__init__.py only contains one: \"from jenkins import plugins\".\n\nAlso note that, while python-jenkins does not conform to this particular rule, most Openstack projects enforce a style which imports only modules, not objects from modules; thus, \"from six.moves.urllib import error\" and referencing \"error.HTTPError\".  This is a style rule I won\u0027t force you to follow, but I think it would be nice if you did :)","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"12cf133378d16f17766e69959c581b08b06a73f3","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import logging"},{"line_number":17,"context_line":"import re"},{"line_number":18,"context_line":"from six.moves.urllib.error import HTTPError"},{"line_number":19,"context_line":"from six.moves.urllib.request import BaseHandler, build_opener"},{"line_number":20,"context_line":"import kerberos"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_e254d5fe","line":18,"in_reply_to":"9a8ffd7b_9ae308d8","updated":"2016-01-24 17:29:58.000000000","message":"Done","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ae4f5cdac9fce58e4f709a0fea6de685348e28be","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import re"},{"line_number":18,"context_line":"from six.moves.urllib.error import HTTPError"},{"line_number":19,"context_line":"from six.moves.urllib.request import BaseHandler, build_opener"},{"line_number":20,"context_line":"import kerberos"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"logger \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_fa17b4a0","line":20,"updated":"2015-12-02 22:57:52.000000000","message":"Another stylistic rule that python-jenkins *does* follow is sorting of imports; this import should be before the \u0027six.moves.urllib.error.HTTPError\" import.  (It should be after the \"re\" import only because there should be a blank line after that one, since \"re\" is a standard library import and \"kerberos\" is a third-party import.)","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"12cf133378d16f17766e69959c581b08b06a73f3","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import re"},{"line_number":18,"context_line":"from six.moves.urllib.error import HTTPError"},{"line_number":19,"context_line":"from six.moves.urllib.request import BaseHandler, build_opener"},{"line_number":20,"context_line":"import kerberos"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"logger \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_025a492a","line":20,"in_reply_to":"9a8ffd7b_fa17b4a0","updated":"2016-01-24 17:29:58.000000000","message":"Done","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ae4f5cdac9fce58e4f709a0fea6de685348e28be","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.max_tries \u003d max_tries"},{"line_number":32,"context_line":"        self.re_extract_auth \u003d re.compile(\u0027.*?Negotiate\\s*([^,]*)\u0027, re.I)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def http_error_401(self, req, _, __, ___, headers):"},{"line_number":35,"context_line":"        logger.debug(\"INSIDE http_error_401\")"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_3a71bc0c","line":34,"updated":"2015-12-02 22:57:52.000000000","message":"It would probably be better to use something other than strings of underscores for parameter names here.  For one, there is always the potential that translations could be added to python-jenkins, and the \u0027_\u0027 name would clash with the typical name used for that functionality.","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"12cf133378d16f17766e69959c581b08b06a73f3","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.max_tries \u003d max_tries"},{"line_number":32,"context_line":"        self.re_extract_auth \u003d re.compile(\u0027.*?Negotiate\\s*([^,]*)\u0027, re.I)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def http_error_401(self, req, _, __, ___, headers):"},{"line_number":35,"context_line":"        logger.debug(\"INSIDE http_error_401\")"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_6249c55f","line":34,"in_reply_to":"9a8ffd7b_3a71bc0c","updated":"2016-01-24 17:29:58.000000000","message":"Done","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":6987,"name":"Khai Do","email":"zaro0508@gmail.com","username":"zaro0508"},"change_message_id":"a82934fb55e1bce3747f778346139310a03edeb4","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            try:"},{"line_number":38,"context_line":"                krb_req \u003d self._extract_krb_value(headers)"},{"line_number":39,"context_line":"            except ValueError:"},{"line_number":40,"context_line":"                # Negotiate header not found or a similiar error"},{"line_number":41,"context_line":"                # we can\u0027t handle this, let the next handler have a go"},{"line_number":42,"context_line":"                return None"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_7acc2489","line":40,"updated":"2015-12-02 22:56:40.000000000","message":"nit: similar","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"12cf133378d16f17766e69959c581b08b06a73f3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            try:"},{"line_number":38,"context_line":"                krb_req \u003d self._extract_krb_value(headers)"},{"line_number":39,"context_line":"            except ValueError:"},{"line_number":40,"context_line":"                # Negotiate header not found or a similiar error"},{"line_number":41,"context_line":"                # we can\u0027t handle this, let the next handler have a go"},{"line_number":42,"context_line":"                return None"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_8246394d","line":40,"in_reply_to":"9a8ffd7b_7acc2489","updated":"2016-01-24 17:29:58.000000000","message":"Done","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ae4f5cdac9fce58e4f709a0fea6de685348e28be","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def _krb_response(self, host, krb_val):"},{"line_number":78,"context_line":"        logger.debug(\"INSIDE _krb_response\")"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        _, self.krb_context \u003d kerberos.authGSSClientInit(\"HTTP@%s\" % host)"},{"line_number":81,"context_line":"        kerberos.authGSSClientStep(self.krb_context, krb_val)"},{"line_number":82,"context_line":"        response \u003d kerberos.authGSSClientResponse(self.krb_context)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_9ae468a8","line":80,"updated":"2015-12-02 22:57:52.000000000","message":"Again, probably best to avoid using \u0027_\u0027 as a variable name, so we don\u0027t have accidental clashes with any future i18n conversion.  I like to use a leading underscore to mark variables that are not intended to be referenced, e.g., \"_dummy\".","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"12cf133378d16f17766e69959c581b08b06a73f3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def _krb_response(self, host, krb_val):"},{"line_number":78,"context_line":"        logger.debug(\"INSIDE _krb_response\")"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        _, self.krb_context \u003d kerberos.authGSSClientInit(\"HTTP@%s\" % host)"},{"line_number":81,"context_line":"        kerberos.authGSSClientStep(self.krb_context, krb_val)"},{"line_number":82,"context_line":"        response \u003d kerberos.authGSSClientResponse(self.krb_context)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_a26a5db1","line":80,"in_reply_to":"9a8ffd7b_9ae468a8","updated":"2016-01-24 17:29:58.000000000","message":"Done","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":6987,"name":"Khai Do","email":"zaro0508@gmail.com","username":"zaro0508"},"change_message_id":"a82934fb55e1bce3747f778346139310a03edeb4","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            raise ValueError(msg)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def test():"},{"line_number":125,"context_line":"    import sys"},{"line_number":126,"context_line":"    logging.basicConfig()"},{"line_number":127,"context_line":"    logger.setLevel(logging.DEBUG)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_1a9cf868","line":124,"updated":"2015-12-02 22:56:40.000000000","message":"Could you please move tests to the \u0027tests\u0027 folder?","commit_id":"0a0339686e11359101140876c30774989b5c43af"},{"author":{"_account_id":6987,"name":"Khai Do","email":"zaro0508@gmail.com","username":"zaro0508"},"change_message_id":"a82934fb55e1bce3747f778346139310a03edeb4","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    print(resp.code)"},{"line_number":132,"context_line":"    # print(\"\".join(resp.readlines()))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":135,"context_line":"    test()"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a8ffd7b_1a73984f","line":134,"updated":"2015-12-02 22:56:40.000000000","message":"not needed once tests are moved.","commit_id":"0a0339686e11359101140876c30774989b5c43af"}],"test-requirements.txt":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"026991a1778f633eef510f0f3e95f4d7afe408a9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"coverage\u003e\u003d3.6"},{"line_number":2,"context_line":"discover"},{"line_number":3,"context_line":"hacking\u003e\u003d0.5.6,\u003c0.11"},{"line_number":4,"context_line":"kerberos\u003d\u003d1.2.2"},{"line_number":5,"context_line":"mock\u003c1.1"},{"line_number":6,"context_line":"unittest2"},{"line_number":7,"context_line":"python-subunit"}],"source_content_type":"text/plain","patch_set":8,"id":"9a68dd71_ca42dfad","line":4,"updated":"2016-01-25 16:44:03.000000000","message":"Pinning to a specific version is probably not a good idea.  I realize that there are problems with 1.2.3 and that you\u0027re waiting for 1.2.4 (or perhaps 1.3.0?) to be released, but this could probably be written like so:\n\n    kerberos\u003e\u003d1.2.2,!\u003d1.2.3\n\nIf you want to set an upper bound to deal with backwards compatibility breaks before they happen, that could look like:\n\n    kerberos\u003e\u003d1.2.2,\u003c1.3,!\u003d1.2.3\n\nEven so, I would discourage placing an upper bound on this if it can be avoided…","commit_id":"cdee9d4be32fdb29ea92f02223b62464e8db4cb9"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"e3b6a91b72bf08aae620b48867419a5b700e0725","unresolved":false,"context_lines":[{"line_number":1,"context_line":"coverage\u003e\u003d3.6"},{"line_number":2,"context_line":"discover"},{"line_number":3,"context_line":"hacking\u003e\u003d0.5.6,\u003c0.11"},{"line_number":4,"context_line":"kerberos\u003d\u003d1.2.2"},{"line_number":5,"context_line":"mock\u003c1.1"},{"line_number":6,"context_line":"unittest2"},{"line_number":7,"context_line":"python-subunit"}],"source_content_type":"text/plain","patch_set":8,"id":"9a68dd71_2ebdc6d7","line":4,"in_reply_to":"9a68dd71_ca42dfad","updated":"2016-01-25 19:46:16.000000000","message":"Sorted.\n\nkerberos 1.2.4 has been released and the build problem has been fixed.","commit_id":"cdee9d4be32fdb29ea92f02223b62464e8db4cb9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"b5b7d0e8f3ee59237e32cc12103084ef0bebfe5f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"coverage\u003e\u003d3.6"},{"line_number":2,"context_line":"discover"},{"line_number":3,"context_line":"hacking\u003e\u003d0.5.6,\u003c0.11"},{"line_number":4,"context_line":"kerberos"},{"line_number":5,"context_line":"mock\u003c1.1"},{"line_number":6,"context_line":"unittest2"},{"line_number":7,"context_line":"python-subunit"}],"source_content_type":"text/plain","patch_set":9,"id":"9a68dd71_d3c84eaa","line":4,"updated":"2016-01-25 21:15:42.000000000","message":"Let me suggest using:\n\n    kerberos\u003e\u003d1.2.4","commit_id":"f53dfcc837994580ba4d9167a0abd93968f8421f"}],"tests/test_kerberos.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"026991a1778f633eef510f0f3e95f4d7afe408a9","unresolved":false,"context_lines":[{"line_number":9,"context_line":"if sys.version_info \u003c (2, 7):"},{"line_number":10,"context_line":"    import unittest2 as unittest"},{"line_number":11,"context_line":"else:"},{"line_number":12,"context_line":"    import unittest"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"class KerberosTest(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_3522fca3","line":12,"updated":"2016-01-25 16:44:03.000000000","message":"I\u0027d using tests.base.JenkinsTestBase, so you can avoid copying this logic here.  If that\u0027s not going to work, then I suggest using testtools.TestBase, as is used for test_jenkins_sockets.py.  That class should contain most of the asserts you might need from unittest2…","commit_id":"cdee9d4be32fdb29ea92f02223b62464e8db4cb9"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"e3b6a91b72bf08aae620b48867419a5b700e0725","unresolved":false,"context_lines":[{"line_number":9,"context_line":"if sys.version_info \u003c (2, 7):"},{"line_number":10,"context_line":"    import unittest2 as unittest"},{"line_number":11,"context_line":"else:"},{"line_number":12,"context_line":"    import unittest"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"class KerberosTest(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_6ec73e64","line":12,"in_reply_to":"9a68dd71_3522fca3","updated":"2016-01-25 19:46:16.000000000","message":"I have changed the base class to testtools.TestBase.","commit_id":"cdee9d4be32fdb29ea92f02223b62464e8db4cb9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"026991a1778f633eef510f0f3e95f4d7afe408a9","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    @patch(\u0027kerberos.authGSSClientStep\u0027)"},{"line_number":19,"context_line":"    @patch(\u0027kerberos.authGSSClientInit\u0027)"},{"line_number":20,"context_line":"    @patch(\u0027kerberos.authGSSClientClean\u0027)"},{"line_number":21,"context_line":"    def test_simple(self, clean_mock, init_mock, step_mock, response_mock):"},{"line_number":22,"context_line":"        headers_from_server \u003d {\u0027www-authenticate\u0027: \u0027Negotiate xxx\u0027}"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        init_mock.side_effect \u003d lambda x: (x, \"context\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_5508d0d9","line":21,"updated":"2016-01-25 16:44:03.000000000","message":"What I like to do with unit tests is test each unit, that is, each function or method, independently.  That is, there\u0027d be a set of tests for __init__(), one for http_error_401(), etc.  I say \"set of tests\" because my personal preference is to try to test every single branch, and it\u0027s helpful to have each of those tests in a separate test method, so test failure messages can help you narrow down what failed.","commit_id":"cdee9d4be32fdb29ea92f02223b62464e8db4cb9"},{"author":{"_account_id":15869,"name":"Lukas Vacek","email":"lucas.vacek@gmail.com","username":"lukas-vacek"},"change_message_id":"e3b6a91b72bf08aae620b48867419a5b700e0725","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    @patch(\u0027kerberos.authGSSClientStep\u0027)"},{"line_number":19,"context_line":"    @patch(\u0027kerberos.authGSSClientInit\u0027)"},{"line_number":20,"context_line":"    @patch(\u0027kerberos.authGSSClientClean\u0027)"},{"line_number":21,"context_line":"    def test_simple(self, clean_mock, init_mock, step_mock, response_mock):"},{"line_number":22,"context_line":"        headers_from_server \u003d {\u0027www-authenticate\u0027: \u0027Negotiate xxx\u0027}"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        init_mock.side_effect \u003d lambda x: (x, \"context\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_2e2e26fb","line":21,"in_reply_to":"9a68dd71_5508d0d9","updated":"2016-01-25 19:46:16.000000000","message":"I have added many more tests, I didn\u0027t want to go overboard here but I have added also tests for several possible error conditions (including both unexpected responses from the web server and kerberos exceptions).","commit_id":"cdee9d4be32fdb29ea92f02223b62464e8db4cb9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"b5b7d0e8f3ee59237e32cc12103084ef0bebfe5f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import testtools"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"import kerberos"},{"line_number":4,"context_line":"assert kerberos  # pyflakes"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_b3491a33","line":1,"updated":"2016-01-25 21:15:42.000000000","message":"So, testtools is one of those \"third party\" imports, so it should be imported after the \"from mock import patch, Mock\" line…","commit_id":"f53dfcc837994580ba4d9167a0abd93968f8421f"}]}
