)]}'
{"nova/test.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"75fe24c59530c4c41a97d917d743957fbbb822bb","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        return svc.service"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"class APICoverage(object):"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    cover_api \u003d None"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMX%2F%2F0Ss%3D","line":227,"updated":"2012-12-14 06:59:00.000000000","message":"APICoverage needs a docstring, covering the intent of the class.","commit_id":"9138e99c144de166ad9f5bddd0e110244ffbbf8e"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"75fe24c59530c4c41a97d917d743957fbbb822bb","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    cover_api \u003d None"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_api_methods(self):"},{"line_number":232,"context_line":"        self.assertTrue(self.cover_api is not None)"},{"line_number":233,"context_line":"        api_methods \u003d [x for x in dir(self.cover_api)"},{"line_number":234,"context_line":"                       if not x.startswith(\u0027_\u0027)]"},{"line_number":235,"context_line":"        test_methods \u003d [x[5:] for x in dir(self)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMX%2F%2F0Sc%3D","line":232,"updated":"2012-12-14 06:59:00.000000000","message":"I don\u0027t think thats tied to the integrity of the test. The necessary condition is that all the public methods we find on cover_api are things that we want tests for, and a bad cover_api setting can be detected by the absence of found public methods. So - drop the assertTrue.","commit_id":"9138e99c144de166ad9f5bddd0e110244ffbbf8e"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"75fe24c59530c4c41a97d917d743957fbbb822bb","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    def test_api_methods(self):"},{"line_number":232,"context_line":"        self.assertTrue(self.cover_api is not None)"},{"line_number":233,"context_line":"        api_methods \u003d [x for x in dir(self.cover_api)"},{"line_number":234,"context_line":"                       if not x.startswith(\u0027_\u0027)]"},{"line_number":235,"context_line":"        test_methods \u003d [x[5:] for x in dir(self)"},{"line_number":236,"context_line":"                        if x.startswith(\u0027test_\u0027)]"},{"line_number":237,"context_line":"        self.assertThat("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMX%2F%2F0TE%3D","line":234,"updated":"2012-12-14 06:59:00.000000000","message":"This will pick up attributes as well as methods. You need a type check or inspect call.\n\napi_method_names \u003d [n for n in dir(self.cover_api) \n    if inspect.ismethod(getattr(self.cover_api, n))\n        and not n.startswith(\u0027_\u0027)]\n\nAnd then, we can check the test integrity:\n    self.assertNotEqual([], api_method_names)","commit_id":"9138e99c144de166ad9f5bddd0e110244ffbbf8e"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"75fe24c59530c4c41a97d917d743957fbbb822bb","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        api_methods \u003d [x for x in dir(self.cover_api)"},{"line_number":234,"context_line":"                       if not x.startswith(\u0027_\u0027)]"},{"line_number":235,"context_line":"        test_methods \u003d [x[5:] for x in dir(self)"},{"line_number":236,"context_line":"                        if x.startswith(\u0027test_\u0027)]"},{"line_number":237,"context_line":"        self.assertThat("},{"line_number":238,"context_line":"            test_methods,"},{"line_number":239,"context_line":"            testtools.matchers.ContainsAll(api_methods))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMX%2F%2F0S0%3D","line":236,"updated":"2012-12-14 06:59:00.000000000","message":"This likewise, but you also need to indirect to the class (vs instance) [we want to check the class behaviour].\n\n    test_method_names \u003d [n[5:] for n in dir(type(self))\n        if inspect.ismethod(getattr(type(self), n) and n.startswith(\u0027test_\u0027)]","commit_id":"9138e99c144de166ad9f5bddd0e110244ffbbf8e"}],"nova/tests/compute/test_virtapi.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"75fe24c59530c4c41a97d917d743957fbbb822bb","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(VirtAPIBaseTest, self).setUp()"},{"line_number":33,"context_line":"        self.context \u003d context.RequestContext(\u0027fake-user\u0027, \u0027fake-project\u0027)"},{"line_number":34,"context_line":"        self.set_up_virtapi()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def set_up_virtapi(self):"},{"line_number":37,"context_line":"        self.virtapi \u003d virtapi.VirtAPI()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMX%2F%2F0Tg%3D","line":34,"updated":"2012-12-14 06:59:00.000000000","message":"This double-indirection through setup_up_virtapi seems pointless, if you follow Dan\u0027s suggestion it can just be self.cover_api()","commit_id":"9138e99c144de166ad9f5bddd0e110244ffbbf8e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d4a546e59692a252aa2f48ed047a6b2dfa88b599","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.set_up_virtapi()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def set_up_virtapi(self):"},{"line_number":37,"context_line":"        self.virtapi \u003d virtapi.VirtAPI()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def assertExpected(self, method, *args, **kwargs):"},{"line_number":40,"context_line":"        self.assertRaises(NotImplementedError,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMX%2F%2F0as%3D","line":37,"updated":"2012-12-14 02:50:07.000000000","message":"Could probably make this generic for two of the cases by doing:\n\nself.virtapi \u003d self.cover_api()","commit_id":"9138e99c144de166ad9f5bddd0e110244ffbbf8e"}]}
