)]}'
{"keystonemiddleware/auth_token.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ced0a8dfa2f87092ab1ac657378b11781be99ad5","unresolved":false,"context_lines":[{"line_number":643,"context_line":"        self._identity_server \u003d self._identity_server_factory()"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        self._signing_directory \u003d _SigningDirectory("},{"line_number":646,"context_line":"            self._conf_get(\u0027signing_dir\u0027), self._LOG)"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        self._memcache_security_strategy \u003d ("},{"line_number":649,"context_line":"            self._conf_get(\u0027memcache_security_strategy\u0027))"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_8e284c9b","line":646,"updated":"2014-10-07 20:02:37.000000000","message":"should these be passed in a keyword arguments since `__init__()` has them as keyword args?","commit_id":"178c6508d2ec7b5a2e6d7ad2295bdd8ff960bea3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fdfa6b0bf515a1e93142ece3d31e305cafa5088e","unresolved":false,"context_lines":[{"line_number":643,"context_line":"        self._identity_server \u003d self._identity_server_factory()"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        self._signing_directory \u003d _SigningDirectory("},{"line_number":646,"context_line":"            self._conf_get(\u0027signing_dir\u0027), self._LOG)"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        self._memcache_security_strategy \u003d ("},{"line_number":649,"context_line":"            self._conf_get(\u0027memcache_security_strategy\u0027))"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_c014bf4e","line":646,"in_reply_to":"baa201ad_8e284c9b","updated":"2014-10-08 20:22:35.000000000","message":"Done","commit_id":"178c6508d2ec7b5a2e6d7ad2295bdd8ff960bea3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ced0a8dfa2f87092ab1ac657378b11781be99ad5","unresolved":false,"context_lines":[{"line_number":1586,"context_line":"        return os.path.join(self._directory_name, file_name)"},{"line_number":1587,"context_line":""},{"line_number":1588,"context_line":"    def _verify_signing_dir(self):"},{"line_number":1589,"context_line":"        if os.path.exists(self._directory_name):"},{"line_number":1590,"context_line":"            if not os.access(self._directory_name, os.W_OK):"},{"line_number":1591,"context_line":"                raise ConfigurationError("},{"line_number":1592,"context_line":"                    \u0027unable to access signing_dir %s\u0027 % self._directory_name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_092a967e","line":1589,"updated":"2014-10-07 20:02:37.000000000","message":"suggest changing `os.path.exists` to `os.path.isdir`, since `os.path.exists` will return True is a file or directory is passed into _verify_signing_dir()","commit_id":"178c6508d2ec7b5a2e6d7ad2295bdd8ff960bea3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fdfa6b0bf515a1e93142ece3d31e305cafa5088e","unresolved":false,"context_lines":[{"line_number":1586,"context_line":"        return os.path.join(self._directory_name, file_name)"},{"line_number":1587,"context_line":""},{"line_number":1588,"context_line":"    def _verify_signing_dir(self):"},{"line_number":1589,"context_line":"        if os.path.exists(self._directory_name):"},{"line_number":1590,"context_line":"            if not os.access(self._directory_name, os.W_OK):"},{"line_number":1591,"context_line":"                raise ConfigurationError("},{"line_number":1592,"context_line":"                    \u0027unable to access signing_dir %s\u0027 % self._directory_name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_c615b840","line":1589,"in_reply_to":"baa201ad_092a967e","updated":"2014-10-08 20:22:35.000000000","message":"Done","commit_id":"178c6508d2ec7b5a2e6d7ad2295bdd8ff960bea3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ced0a8dfa2f87092ab1ac657378b11781be99ad5","unresolved":false,"context_lines":[{"line_number":1592,"context_line":"                    \u0027unable to access signing_dir %s\u0027 % self._directory_name)"},{"line_number":1593,"context_line":"            uid \u003d os.getuid()"},{"line_number":1594,"context_line":"            if os.stat(self._directory_name).st_uid !\u003d uid:"},{"line_number":1595,"context_line":"                self._log.warning(\u0027signing_dir is not owned by %s\u0027, uid)"},{"line_number":1596,"context_line":"            current_mode \u003d stat.S_IMODE(os.stat(self._directory_name).st_mode)"},{"line_number":1597,"context_line":"            if current_mode !\u003d stat.S_IRWXU:"},{"line_number":1598,"context_line":"                self._log.warning("}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_0951b60e","line":1595,"updated":"2014-10-07 20:02:37.000000000","message":"nit: could suggest that the user changes the permissions on the signing_dir to avoid other problems?","commit_id":"178c6508d2ec7b5a2e6d7ad2295bdd8ff960bea3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fdfa6b0bf515a1e93142ece3d31e305cafa5088e","unresolved":false,"context_lines":[{"line_number":1592,"context_line":"                    \u0027unable to access signing_dir %s\u0027 % self._directory_name)"},{"line_number":1593,"context_line":"            uid \u003d os.getuid()"},{"line_number":1594,"context_line":"            if os.stat(self._directory_name).st_uid !\u003d uid:"},{"line_number":1595,"context_line":"                self._log.warning(\u0027signing_dir is not owned by %s\u0027, uid)"},{"line_number":1596,"context_line":"            current_mode \u003d stat.S_IMODE(os.stat(self._directory_name).st_mode)"},{"line_number":1597,"context_line":"            if current_mode !\u003d stat.S_IRWXU:"},{"line_number":1598,"context_line":"                self._log.warning("}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_262e848c","line":1595,"in_reply_to":"baa201ad_0951b60e","updated":"2014-10-08 20:22:35.000000000","message":"I don\u0027t know what this means. If you have alternative text to propose then I\u0027ll change it.","commit_id":"178c6508d2ec7b5a2e6d7ad2295bdd8ff960bea3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a1f427ca2b97e72da2faf468b6ec431ba0f9b147","unresolved":false,"context_lines":[{"line_number":1592,"context_line":"                    \u0027unable to access signing_dir %s\u0027 % self._directory_name)"},{"line_number":1593,"context_line":"            uid \u003d os.getuid()"},{"line_number":1594,"context_line":"            if os.stat(self._directory_name).st_uid !\u003d uid:"},{"line_number":1595,"context_line":"                self._log.warning(\u0027signing_dir is not owned by %s\u0027, uid)"},{"line_number":1596,"context_line":"            current_mode \u003d stat.S_IMODE(os.stat(self._directory_name).st_mode)"},{"line_number":1597,"context_line":"            if current_mode !\u003d stat.S_IRWXU:"},{"line_number":1598,"context_line":"                self._log.warning("}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_c956ab5b","line":1595,"in_reply_to":"baa201ad_262e848c","updated":"2014-10-08 21:21:27.000000000","message":"I can\u0027t think of anything that would make it simpler.","commit_id":"178c6508d2ec7b5a2e6d7ad2295bdd8ff960bea3"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"863b721da755672eab84479827f51212b42f22fb","unresolved":false,"context_lines":[{"line_number":1154,"context_line":"                open_kwargs \u003d {\u0027encoding\u0027: \u0027utf-8\u0027} if six.PY3 else {}"},{"line_number":1155,"context_line":"                revoked_file_name \u003d self._signing_directory.calc_path("},{"line_number":1156,"context_line":"                    self._REVOKED_FILE_NAME)"},{"line_number":1157,"context_line":"                with open(revoked_file_name, \u0027r\u0027, **open_kwargs) as f:"},{"line_number":1158,"context_line":"                    self._token_revocation_list_prop \u003d jsonutils.loads("},{"line_number":1159,"context_line":"                        f.read())"},{"line_number":1160,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa7fdbe_191906d7","line":1157,"updated":"2014-10-27 12:56:25.000000000","message":"given that we have signing_dir.write_file, a signing_dir.read_file is probably appropriate.\n\nWho knows how atomic file read works on windows...","commit_id":"0521975840b68de04b1b3911e2fad5c2353d6689"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"b0be2163d971f8859b6b2cac3bbed5fe7302eda9","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"                       directory_name)"},{"line_number":1562,"context_line":"        self._directory_name \u003d directory_name"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"        self._verify_signing_dir()"},{"line_number":1565,"context_line":""},{"line_number":1566,"context_line":"    def write_file(self, file_name, new_contents):"},{"line_number":1567,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_c9606b03","line":1564,"updated":"2014-10-08 21:34:38.000000000","message":"Why should it create the directory, when it gets created lazily in write_file()?","commit_id":"0521975840b68de04b1b3911e2fad5c2353d6689"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"863b721da755672eab84479827f51212b42f22fb","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"                       directory_name)"},{"line_number":1562,"context_line":"        self._directory_name \u003d directory_name"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"        self._verify_signing_dir()"},{"line_number":1565,"context_line":""},{"line_number":1566,"context_line":"    def write_file(self, file_name, new_contents):"},{"line_number":1567,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa7fdbe_7905b244","line":1564,"in_reply_to":"baa201ad_6ccdcd30","updated":"2014-10-27 12:56:25.000000000","message":"there was a reason for this - and i can\u0027t quite remember it. \n\nI think initially we weren\u0027t creating the folder until we wanted to write the file - however now we create the folder on startup so I would tend to agree we should be able to bring _verify_signing_dir purely into __init__\n\n\nUnless anyone else can remember why we did it on Failure as well. ayoung?","commit_id":"0521975840b68de04b1b3911e2fad5c2353d6689"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2f549b870cd7cc453efdef0bfe7721d42c716d46","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"                       directory_name)"},{"line_number":1562,"context_line":"        self._directory_name \u003d directory_name"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"        self._verify_signing_dir()"},{"line_number":1565,"context_line":""},{"line_number":1566,"context_line":"    def write_file(self, file_name, new_contents):"},{"line_number":1567,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_6ccdcd30","line":1564,"in_reply_to":"baa201ad_c9606b03","updated":"2014-10-08 22:03:42.000000000","message":"This is how the code worked before, so I just left it the same. The goal of this change is just to refactor things to put them together into a class and not to change behavior.","commit_id":"0521975840b68de04b1b3911e2fad5c2353d6689"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"b0be2163d971f8859b6b2cac3bbed5fe7302eda9","unresolved":false,"context_lines":[{"line_number":1579,"context_line":"        try:"},{"line_number":1580,"context_line":"            _atomic_write()"},{"line_number":1581,"context_line":"        except (OSError, IOError):"},{"line_number":1582,"context_line":"            self._verify_signing_dir()"},{"line_number":1583,"context_line":"            _atomic_write()"},{"line_number":1584,"context_line":""},{"line_number":1585,"context_line":"    def calc_path(self, file_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_ec37fde0","line":1582,"updated":"2014-10-08 21:34:38.000000000","message":"Maybe this check should run regardless of _atomic_write success, because it only warns about some bad permissions, but doesn\u0027t fail on them","commit_id":"0521975840b68de04b1b3911e2fad5c2353d6689"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2f549b870cd7cc453efdef0bfe7721d42c716d46","unresolved":false,"context_lines":[{"line_number":1579,"context_line":"        try:"},{"line_number":1580,"context_line":"            _atomic_write()"},{"line_number":1581,"context_line":"        except (OSError, IOError):"},{"line_number":1582,"context_line":"            self._verify_signing_dir()"},{"line_number":1583,"context_line":"            _atomic_write()"},{"line_number":1584,"context_line":""},{"line_number":1585,"context_line":"    def calc_path(self, file_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_2cf6655d","line":1582,"in_reply_to":"baa201ad_ec37fde0","updated":"2014-10-08 22:03:42.000000000","message":"This is how the code worked before, so I just left it the same.","commit_id":"0521975840b68de04b1b3911e2fad5c2353d6689"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"90709591f07329c929df65a305c40eb3f3c159b4","unresolved":false,"context_lines":[{"line_number":1657,"context_line":"        self._verify_signing_dir()"},{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"    def write_file(self, file_name, new_contents):"},{"line_number":1660,"context_line":""},{"line_number":1661,"context_line":"        # In Python2, encoding is slow so the following check avoids it if it"},{"line_number":1662,"context_line":"        # is not absolutely necessary."},{"line_number":1663,"context_line":"        if isinstance(new_contents, six.text_type):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_96387bef","line":1660,"updated":"2015-02-12 01:19:42.000000000","message":"NIT: remove extra space","commit_id":"f302ed5fdbbf0925f59cf2ae13db680038d41ddd"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"a0a1c0c5694af021b64c23f1420d56b6cf334e51","unresolved":false,"context_lines":[{"line_number":1657,"context_line":"        self._verify_signing_dir()"},{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"    def write_file(self, file_name, new_contents):"},{"line_number":1660,"context_line":""},{"line_number":1661,"context_line":"        # In Python2, encoding is slow so the following check avoids it if it"},{"line_number":1662,"context_line":"        # is not absolutely necessary."},{"line_number":1663,"context_line":"        if isinstance(new_contents, six.text_type):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_011e0270","line":1660,"in_reply_to":"da86d52c_111735ef","updated":"2015-02-12 02:35:54.000000000","message":"Cool, makes sense","commit_id":"f302ed5fdbbf0925f59cf2ae13db680038d41ddd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"681b560a61732f7bd5eb7493715eeabc44bc0f0e","unresolved":false,"context_lines":[{"line_number":1657,"context_line":"        self._verify_signing_dir()"},{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"    def write_file(self, file_name, new_contents):"},{"line_number":1660,"context_line":""},{"line_number":1661,"context_line":"        # In Python2, encoding is slow so the following check avoids it if it"},{"line_number":1662,"context_line":"        # is not absolutely necessary."},{"line_number":1663,"context_line":"        if isinstance(new_contents, six.text_type):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_111735ef","line":1660,"in_reply_to":"da86d52c_96387bef","updated":"2015-02-12 01:25:30.000000000","message":"The extra line is important here, because otherwise it looks like this comment is for the entire method and not just for the following section of code.","commit_id":"f302ed5fdbbf0925f59cf2ae13db680038d41ddd"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"90709591f07329c929df65a305c40eb3f3c159b4","unresolved":false,"context_lines":[{"line_number":1670,"context_line":"            os.rename(f.name, self.calc_path(file_name))"},{"line_number":1671,"context_line":""},{"line_number":1672,"context_line":"        try:"},{"line_number":1673,"context_line":"            _atomic_write()"},{"line_number":1674,"context_line":"        except (OSError, IOError):"},{"line_number":1675,"context_line":"            self._verify_signing_dir()"},{"line_number":1676,"context_line":"            _atomic_write()"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_d1dd9d71","line":1673,"updated":"2015-02-12 01:19:42.000000000","message":"Doesn\u0027t make a difference in functionality, but I am wondering why you didn\u0027t pass file_name and new_contents as argument. Just for less code?","commit_id":"f302ed5fdbbf0925f59cf2ae13db680038d41ddd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"681b560a61732f7bd5eb7493715eeabc44bc0f0e","unresolved":false,"context_lines":[{"line_number":1670,"context_line":"            os.rename(f.name, self.calc_path(file_name))"},{"line_number":1671,"context_line":""},{"line_number":1672,"context_line":"        try:"},{"line_number":1673,"context_line":"            _atomic_write()"},{"line_number":1674,"context_line":"        except (OSError, IOError):"},{"line_number":1675,"context_line":"            self._verify_signing_dir()"},{"line_number":1676,"context_line":"            _atomic_write()"}],"source_content_type":"text/x-python","patch_set":22,"id":"da86d52c_91b16503","line":1673,"in_reply_to":"da86d52c_d1dd9d71","updated":"2015-02-12 01:25:30.000000000","message":"I don\u0027t remember what I was thinking when I wrote this 5 months ago... it does remove some duplication since then the same parameters would be used at line 1676.","commit_id":"f302ed5fdbbf0925f59cf2ae13db680038d41ddd"}],"keystonemiddleware/tests/unit/test_auth_token.py":[{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"29e9c4669ea6af42b566aab4cef407a227bb3a89","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        auth_token._SigningDirectory(directory_name)"},{"line_number":36,"context_line":"        self.addCleanup(shutil.rmtree, parent_directory)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # NOTE(wu_wenxiang): Verify if the signing dir was created as expected."},{"line_number":39,"context_line":"        self.assertTrue(os.path.isdir(directory_name))"},{"line_number":40,"context_line":"        self.assertTrue(os.access(directory_name, os.W_OK))"},{"line_number":41,"context_line":"        self.assertEqual(os.stat(directory_name).st_uid, os.getuid())"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a961159_279316a4","line":38,"updated":"2015-01-07 08:23:05.000000000","message":"I think we don\u0027t need NOTE.","commit_id":"01281770c4ab8acadda7b48640187ce901cdfa36"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"457d803d0e166ba57a00a49c6cfce7b657d80b53","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        auth_token._SigningDirectory(directory_name)"},{"line_number":36,"context_line":"        self.addCleanup(shutil.rmtree, parent_directory)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # NOTE(wu_wenxiang): Verify if the signing dir was created as expected."},{"line_number":39,"context_line":"        self.assertTrue(os.path.isdir(directory_name))"},{"line_number":40,"context_line":"        self.assertTrue(os.access(directory_name, os.W_OK))"},{"line_number":41,"context_line":"        self.assertEqual(os.stat(directory_name).st_uid, os.getuid())"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a961159_7e1da072","line":38,"in_reply_to":"3a961159_279316a4","updated":"2015-01-07 15:23:13.000000000","message":"Done","commit_id":"01281770c4ab8acadda7b48640187ce901cdfa36"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"29e9c4669ea6af42b566aab4cef407a227bb3a89","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        file_name \u003d self.getUniqueString()"},{"line_number":102,"context_line":"        contents \u003d self.getUniqueString()"},{"line_number":103,"context_line":"        signing_directory.write_file(file_name, contents)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def test_read_file(self):"},{"line_number":106,"context_line":"        # Can read a file that was written."}],"source_content_type":"text/x-python","patch_set":18,"id":"3a961159_47e3c233","line":103,"updated":"2015-01-07 08:23:05.000000000","message":"I think we should read the actual contents and compare it with contents to ensure we create file successfully.","commit_id":"01281770c4ab8acadda7b48640187ce901cdfa36"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"457d803d0e166ba57a00a49c6cfce7b657d80b53","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        file_name \u003d self.getUniqueString()"},{"line_number":102,"context_line":"        contents \u003d self.getUniqueString()"},{"line_number":103,"context_line":"        signing_directory.write_file(file_name, contents)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def test_read_file(self):"},{"line_number":106,"context_line":"        # Can read a file that was written."}],"source_content_type":"text/x-python","patch_set":18,"id":"3a961159_14555cf9","line":103,"in_reply_to":"3a961159_47e3c233","updated":"2015-01-07 15:23:13.000000000","message":"Done","commit_id":"01281770c4ab8acadda7b48640187ce901cdfa36"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"29e9c4669ea6af42b566aab4cef407a227bb3a89","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        self.addCleanup(shutil.rmtree, signing_directory._directory_name)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        file_name \u003d self.getUniqueString()"},{"line_number":126,"context_line":"        self.assertRaises(IOError, signing_directory.read_file, file_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a961159_a73c6694","line":126,"updated":"2015-01-07 08:23:05.000000000","message":"I think we\u0027d better add a test for calc_path.","commit_id":"01281770c4ab8acadda7b48640187ce901cdfa36"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"457d803d0e166ba57a00a49c6cfce7b657d80b53","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        self.addCleanup(shutil.rmtree, signing_directory._directory_name)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        file_name \u003d self.getUniqueString()"},{"line_number":126,"context_line":"        self.assertRaises(IOError, signing_directory.read_file, file_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a961159_daef7d85","line":126,"in_reply_to":"3a961159_a73c6694","updated":"2015-01-07 15:23:13.000000000","message":"Done","commit_id":"01281770c4ab8acadda7b48640187ce901cdfa36"}]}
