)]}'
{"neutron/tests/base.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"282aa824b2b0823c4d2c5d913569b447c6ad6cf2","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":"import os.path"},{"line_number":24,"context_line":"import random"},{"line_number":25,"context_line":"import traceback"},{"line_number":26,"context_line":"import weakref"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import eventlet.timeout"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_4467184d","line":25,"updated":"2015-06-10 04:51:44.000000000","message":"pep8 complains on this","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"ebb445a4897e329816e39ce4682dc63d11a57d3a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":"import os.path"},{"line_number":24,"context_line":"import random"},{"line_number":25,"context_line":"import traceback"},{"line_number":26,"context_line":"import weakref"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import eventlet.timeout"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_916aed7f","line":25,"in_reply_to":"3afb71cf_4467184d","updated":"2015-06-10 05:58:34.000000000","message":"Oops, I\u0027d fixed this in a later commit on my branch and so pep8 wasn\u0027t complaining locally :/\n\nFixed.","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"}],"neutron/tests/unit/tests/test_base.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"02352f2e62a93ea062826da12971abda45e33dd7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        except SystemExit:"},{"line_number":39,"context_line":"            # SystemExit escaped!"},{"line_number":40,"context_line":"            result.addFailure(self.case, err\u003dsys.exc_info())"},{"line_number":41,"context_line":"        return result"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class SystemExitTestCase(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_bc12cb60","line":41,"updated":"2015-05-15 18:37:05.000000000","message":"This would be more clear expressed just using a TestResult of some sort and a custom test object: what you have here is legitimate but confusing - I had to read it twice to be sure I got it.","commit_id":"7f6c87cc189de06c7866f879bdbf44627dc83e25"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"396f0e82d8bf1bded55436ff0920596e8b977ccd","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        def runTest(self):"},{"line_number":32,"context_line":"            if self.exitcode is not None:"},{"line_number":33,"context_line":"                sys.exit(self.exitcode)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_no_sysexit(self):"},{"line_number":36,"context_line":"        result \u003d self.MyTestCase(exitcode\u003dNone).run()"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_0aea51ac","line":33,"updated":"2015-06-10 00:40:55.000000000","message":"This is fine, but FTR I\u0027d probably have written it like:\n\n class TestExits(base.DietTestCase):\n\n     @expectfailure\n     def test_zero(self):\n         sys.exit(0)\n\n     @expectfailure\n     def test_one(self):\n         sys.exit(1)\n\nwith nothing else needed. (If the thing breaks your current tests will also exit the interpreter :)","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"16e4cf5a1dc02689db1f03394bac62dbc4b78e2b","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        def runTest(self):"},{"line_number":32,"context_line":"            if self.exitcode is not None:"},{"line_number":33,"context_line":"                sys.exit(self.exitcode)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_no_sysexit(self):"},{"line_number":36,"context_line":"        result \u003d self.MyTestCase(exitcode\u003dNone).run()"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_0dcdcbb6","line":33,"in_reply_to":"3afb71cf_0aea51ac","updated":"2015-06-10 01:02:32.000000000","message":"lifeless\u0027 example is much cleaner.","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"282aa824b2b0823c4d2c5d913569b447c6ad6cf2","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        def runTest(self):"},{"line_number":32,"context_line":"            if self.exitcode is not None:"},{"line_number":33,"context_line":"                sys.exit(self.exitcode)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_no_sysexit(self):"},{"line_number":36,"context_line":"        result \u003d self.MyTestCase(exitcode\u003dNone).run()"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_24e65cb0","line":33,"in_reply_to":"3afb71cf_0dcdcbb6","updated":"2015-06-10 04:51:44.000000000","message":"+1","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"ebb445a4897e329816e39ce4682dc63d11a57d3a","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        def runTest(self):"},{"line_number":32,"context_line":"            if self.exitcode is not None:"},{"line_number":33,"context_line":"                sys.exit(self.exitcode)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_no_sysexit(self):"},{"line_number":36,"context_line":"        result \u003d self.MyTestCase(exitcode\u003dNone).run()"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_719ad16f","line":33,"in_reply_to":"3afb71cf_24e65cb0","updated":"2015-06-10 05:58:34.000000000","message":"I agree lifeless\u0027 is much cleaner, but I avoided @expectfailure because there seems to be confusion between unittest and testtools whether an @expectfailure test that succeeds should be considered a failure or not.  I definitely want to verify that it is considered a failure.","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"396f0e82d8bf1bded55436ff0920596e8b977ccd","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_no_sysexit(self):"},{"line_number":36,"context_line":"        result \u003d self.MyTestCase(exitcode\u003dNone).run()"},{"line_number":37,"context_line":"        self.assertTrue(result.wasSuccessful())"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_sysexit(self):"},{"line_number":40,"context_line":"        expectedFails \u003d [self.MyTestCase(exitcode) for exitcode in (0, 1)]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_ead37502","line":37,"updated":"2015-06-10 00:40:55.000000000","message":"What is this actually testing?","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"ebb445a4897e329816e39ce4682dc63d11a57d3a","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_no_sysexit(self):"},{"line_number":36,"context_line":"        result \u003d self.MyTestCase(exitcode\u003dNone).run()"},{"line_number":37,"context_line":"        self.assertTrue(result.wasSuccessful())"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_sysexit(self):"},{"line_number":40,"context_line":"        expectedFails \u003d [self.MyTestCase(exitcode) for exitcode in (0, 1)]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_0aeb7179","line":37,"in_reply_to":"3afb71cf_ead37502","updated":"2015-06-10 05:58:34.000000000","message":"Verifying that I had not just implemented a \"result\u003dfail\" even when SysExit was not raised.  I agree I could leave it up to other tests to implicitly check that for me ;)","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"396f0e82d8bf1bded55436ff0920596e8b977ccd","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def test_sysexit(self):"},{"line_number":40,"context_line":"        expectedFails \u003d [self.MyTestCase(exitcode) for exitcode in (0, 1)]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        suite \u003d unittest.TestSuite(tests\u003dexpectedFails)"},{"line_number":43,"context_line":"        result \u003d self.defaultTestResult()"},{"line_number":44,"context_line":"        suite.run(result)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_2afced70","line":42,"updated":"2015-06-10 00:40:55.000000000","message":"please don\u0027t use unittest at all. unittest2 or testtools.","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"ebb445a4897e329816e39ce4682dc63d11a57d3a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def test_sysexit(self):"},{"line_number":40,"context_line":"        expectedFails \u003d [self.MyTestCase(exitcode) for exitcode in (0, 1)]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        suite \u003d unittest.TestSuite(tests\u003dexpectedFails)"},{"line_number":43,"context_line":"        result \u003d self.defaultTestResult()"},{"line_number":44,"context_line":"        suite.run(result)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_8a8e41ce","line":42,"in_reply_to":"3afb71cf_2afced70","updated":"2015-06-10 05:58:34.000000000","message":"Done","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"396f0e82d8bf1bded55436ff0920596e8b977ccd","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        suite \u003d unittest.TestSuite(tests\u003dexpectedFails)"},{"line_number":43,"context_line":"        result \u003d self.defaultTestResult()"},{"line_number":44,"context_line":"        suite.run(result)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        self.assertEqual([], result.errors)"},{"line_number":47,"context_line":"        self.assertItemsEqual(expectedFails,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_8aed21b9","line":44,"updated":"2015-06-10 00:40:55.000000000","message":"If this is broken, it can exit 0. I think you might want to either use my ultra small rendering above, or wrap this run with try: except SystemExit:.","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"ebb445a4897e329816e39ce4682dc63d11a57d3a","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        suite \u003d unittest.TestSuite(tests\u003dexpectedFails)"},{"line_number":43,"context_line":"        result \u003d self.defaultTestResult()"},{"line_number":44,"context_line":"        suite.run(result)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        self.assertEqual([], result.errors)"},{"line_number":47,"context_line":"        self.assertItemsEqual(expectedFails,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_4a516935","line":44,"in_reply_to":"3afb71cf_8aed21b9","updated":"2015-06-10 05:58:34.000000000","message":"Good point, added the belt and suspenders.","commit_id":"87b2c021a905e618d6f3f42ef973a21fa35af1b6"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"c7dd31ab485b043a3e2621f8450caa4129ac0ce7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            suite.run(result)"},{"line_number":46,"context_line":"        except SystemExit:"},{"line_number":47,"context_line":"            self.fail(\u0027SystemExit escaped!\u0027)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertEqual([], result.errors)"},{"line_number":50,"context_line":"        self.assertItemsEqual(expectedFails,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_fe870810","line":47,"updated":"2015-06-22 19:38:58.000000000","message":"\"release the hounds!\"","commit_id":"baa09152b79435eef5818ca80da83d9f88765878"}]}
