)]}'
{"nova/api/openstack/__init__.py":[{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"e85b5d4d89f0f046929538188c540b63bf1bf325","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        missing_core_extensions \u003d self.get_missing_core_extensions()"},{"line_number":262,"context_line":"        if missing_core_extensions:"},{"line_number":263,"context_line":"            LOG.critical(\"Missing core API extensions: %s\","},{"line_number":264,"context_line":"                         missing_core_extensions)"},{"line_number":265,"context_line":"            raise exception.CoreAPIMissing("},{"line_number":266,"context_line":"                missing_apis\u003dmissing_core_extensions)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F8k0%3D","line":264,"updated":"2013-05-18 04:28:52.000000000","message":"LOG message should follow \"Internationalization (i18n) Strings\"","commit_id":"4f1f5c4f5d82cf5abe96825145b478f0ebd7da5c"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"08ec4fc64c3637be22f216fcafb539ad48f4bb40","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        missing_core_extensions \u003d self.get_missing_core_extensions()"},{"line_number":262,"context_line":"        if missing_core_extensions:"},{"line_number":263,"context_line":"            LOG.critical(\"Missing core API extensions: %s\","},{"line_number":264,"context_line":"                         missing_core_extensions)"},{"line_number":265,"context_line":"            raise exception.CoreAPIMissing("},{"line_number":266,"context_line":"                missing_apis\u003dmissing_core_extensions)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F8WM%3D","line":264,"in_reply_to":"AAAAPH%2F%2F8k0%3D","updated":"2013-05-18 10:51:36.000000000","message":"Done","commit_id":"4f1f5c4f5d82cf5abe96825145b478f0ebd7da5c"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"e85b5d4d89f0f046929538188c540b63bf1bf325","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        # Expand this list as the core APIs are ported to V3"},{"line_number":272,"context_line":"        core_extensions \u003d [\u0027servers\u0027]"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        extensions_loaded \u003d \\"},{"line_number":275,"context_line":"          self.loaded_extension_info.get_extensions().keys()"},{"line_number":276,"context_line":"        missing_extensions \u003d [x for x in core_extensions"},{"line_number":277,"context_line":"                              if x not in extensions_loaded]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F8kw%3D","line":274,"updated":"2013-05-18 04:28:52.000000000","message":"Long lines should be wrapped in parentheses in preference to using a backslash for line continuation.\n\nRefer to https://github.com/openstack/nova/blame/master/HACKING.rst#L14","commit_id":"4f1f5c4f5d82cf5abe96825145b478f0ebd7da5c"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"08ec4fc64c3637be22f216fcafb539ad48f4bb40","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        # Expand this list as the core APIs are ported to V3"},{"line_number":272,"context_line":"        core_extensions \u003d [\u0027servers\u0027]"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        extensions_loaded \u003d \\"},{"line_number":275,"context_line":"          self.loaded_extension_info.get_extensions().keys()"},{"line_number":276,"context_line":"        missing_extensions \u003d [x for x in core_extensions"},{"line_number":277,"context_line":"                              if x not in extensions_loaded]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2F8WI%3D","line":274,"in_reply_to":"AAAAPH%2F%2F8kw%3D","updated":"2013-05-18 10:51:36.000000000","message":"Done","commit_id":"4f1f5c4f5d82cf5abe96825145b478f0ebd7da5c"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"1d761c25843a4b6428ab1687994d9f59eb45fe7c","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def get_missing_core_extensions(self):"},{"line_number":272,"context_line":"        # Expand this list as the core APIs are ported to V3"},{"line_number":273,"context_line":"        core_extensions \u003d [\u0027servers\u0027]"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        extensions_loaded \u003d (self.loaded_extension_info."},{"line_number":276,"context_line":"                             get_extensions().keys())"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FzK0%3D","line":273,"updated":"2013-05-22 19:16:38.000000000","message":"This is subjective but I don\u0027t really like this tucked away in here.  I would prefer this to be very prominent somewhere.  Maybe a class level member like API_EXTENSION_NAMESPACE or a package level variable.","commit_id":"c7a50a8e5e535725b2873049ebf22ff31e4a6a18"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"7eaf95f773d227e3a2e568972cb271f2df27ed17","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def get_missing_core_extensions(self):"},{"line_number":272,"context_line":"        # Expand this list as the core APIs are ported to V3"},{"line_number":273,"context_line":"        core_extensions \u003d [\u0027servers\u0027]"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        extensions_loaded \u003d (self.loaded_extension_info."},{"line_number":276,"context_line":"                             get_extensions().keys())"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2Fr7A%3D","line":273,"in_reply_to":"AAAAPH%2F%2FsEA%3D","updated":"2013-05-27 06:54:27.000000000","message":"ok. Will add a package level definition of the core APIs at the top of the file so it is very prominent","commit_id":"c7a50a8e5e535725b2873049ebf22ff31e4a6a18"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"d5e114c6fe79b28723a288acd66db930b9b73133","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def get_missing_core_extensions(self):"},{"line_number":272,"context_line":"        # Expand this list as the core APIs are ported to V3"},{"line_number":273,"context_line":"        core_extensions \u003d [\u0027servers\u0027]"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        extensions_loaded \u003d (self.loaded_extension_info."},{"line_number":276,"context_line":"                             get_extensions().keys())"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FsEA%3D","line":273,"in_reply_to":"AAAAPH%2F%2FzK0%3D","updated":"2013-05-27 01:22:04.000000000","message":"Yes, it\u0027s subjective, but I do feel that it\u0027s very important.  I agree that putting it somewhere very very prominent is a good thing.","commit_id":"c7a50a8e5e535725b2873049ebf22ff31e4a6a18"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"07b4eb0d7afb110affa2ae5c4d1af06cf92d21ca","unresolved":false,"context_lines":[{"line_number":55,"context_line":"# List of v3 API extensions which are considered to form"},{"line_number":56,"context_line":"# the core API and so must be present"},{"line_number":57,"context_line":"# TODO(cyeoh): Expand this list as the core APIs are ported to V3"},{"line_number":58,"context_line":"API_V3_CORE_EXTENSIONS \u003d [\u0027servers\u0027]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class FaultWrapper(base_wsgi.Middleware):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2FeOE%3D","line":58,"updated":"2013-06-03 01:52:11.000000000","message":"I\u0027d like to review each addition to this list.  Be sure to ping me on later reviews.","commit_id":"07ad49ceb994cdec5a01f78a804fcf14564fbc9b"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"38b71ab0bee738b89eb1c4a8aa5ae1d3980e7725","unresolved":false,"context_lines":[{"line_number":55,"context_line":"# List of v3 API extensions which are considered to form"},{"line_number":56,"context_line":"# the core API and so must be present"},{"line_number":57,"context_line":"# TODO(cyeoh): Expand this list as the core APIs are ported to V3"},{"line_number":58,"context_line":"API_V3_CORE_EXTENSIONS \u003d [\u0027servers\u0027]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class FaultWrapper(base_wsgi.Middleware):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F%2FX8%3D","line":58,"in_reply_to":"AAAAPH%2F%2FeOE%3D","updated":"2013-06-04 12:49:07.000000000","message":"ok, will do.","commit_id":"07ad49ceb994cdec5a01f78a804fcf14564fbc9b"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"b4958b5bc01f574003c3de0bfbb222776f118213","unresolved":false,"context_lines":[{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def get_missing_core_extensions(self):"},{"line_number":317,"context_line":"        extensions_loaded \u003d (self.loaded_extension_info."},{"line_number":318,"context_line":"                             get_extensions().keys())"},{"line_number":319,"context_line":"        missing_extensions \u003d [x for x in API_V3_CORE_EXTENSIONS"},{"line_number":320,"context_line":"                              if x not in extensions_loaded]"},{"line_number":321,"context_line":"        return missing_extensions"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2FjIY%3D","line":318,"updated":"2013-05-30 19:14:05.000000000","message":"Maybe wrap set() around this so that the following in tests are O(1) rather than O(n).\n\n(I don\u0027t know that we have enough extensions that it really matters, but we might.)","commit_id":"07ad49ceb994cdec5a01f78a804fcf14564fbc9b"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"07b4eb0d7afb110affa2ae5c4d1af06cf92d21ca","unresolved":false,"context_lines":[{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def get_missing_core_extensions(self):"},{"line_number":317,"context_line":"        extensions_loaded \u003d (self.loaded_extension_info."},{"line_number":318,"context_line":"                             get_extensions().keys())"},{"line_number":319,"context_line":"        missing_extensions \u003d [x for x in API_V3_CORE_EXTENSIONS"},{"line_number":320,"context_line":"                              if x not in extensions_loaded]"},{"line_number":321,"context_line":"        return missing_extensions"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2FeNw%3D","line":318,"in_reply_to":"AAAAPH%2F%2FhxM%3D","updated":"2013-06-03 01:52:11.000000000","message":"Nice suggestion, David.","commit_id":"07ad49ceb994cdec5a01f78a804fcf14564fbc9b"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"5ac8f613878ddb8cbcd900fdc05f251c8aa94e47","unresolved":false,"context_lines":[{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def get_missing_core_extensions(self):"},{"line_number":317,"context_line":"        extensions_loaded \u003d (self.loaded_extension_info."},{"line_number":318,"context_line":"                             get_extensions().keys())"},{"line_number":319,"context_line":"        missing_extensions \u003d [x for x in API_V3_CORE_EXTENSIONS"},{"line_number":320,"context_line":"                              if x not in extensions_loaded]"},{"line_number":321,"context_line":"        return missing_extensions"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2FhxM%3D","line":318,"in_reply_to":"AAAAPH%2F%2FjIY%3D","updated":"2013-05-31 07:28:41.000000000","message":"There are currently around 60-70 extensions so I think its worth doing. I\u0027ll fix it up.","commit_id":"07ad49ceb994cdec5a01f78a804fcf14564fbc9b"}],"nova/tests/api/openstack/compute/test_v3_extensions.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"8abcb1edd9cf3e23d619bcf5c7fdc1b51ad3e34a","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        CONF.set_override(\u0027v3_api_extensions_whitelist\u0027, \u0027servers\u0027)"},{"line_number":61,"context_line":"        app \u003d compute.APIRouterV3()"},{"line_number":62,"context_line":"        self.assertNotIn(\u0027os-fixed-ips\u0027, app._loaded_extension_info.extensions)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def test_core_extensions_present(self):"},{"line_number":65,"context_line":"        CONF.set_override(\u0027v3_api_extensions_blacklist\u0027, \u0027servers\u0027)"},{"line_number":66,"context_line":"        self.assertRaises(exception.CoreAPIMissing, compute.APIRouterV3)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2FkA0%3D","line":63,"updated":"2013-05-30 14:10:47.000000000","message":"Just a thought on testing.  Is it possible to test get_missing_core_extensions() more directly?  More of a unit test.  And also, it seems that there will be some value in being able to stub or mock out stevedore for testing purposes to manipulate what it reports as being loaded.  Have you looked into that at all?","commit_id":"07ad49ceb994cdec5a01f78a804fcf14564fbc9b"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"5ac8f613878ddb8cbcd900fdc05f251c8aa94e47","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        CONF.set_override(\u0027v3_api_extensions_whitelist\u0027, \u0027servers\u0027)"},{"line_number":61,"context_line":"        app \u003d compute.APIRouterV3()"},{"line_number":62,"context_line":"        self.assertNotIn(\u0027os-fixed-ips\u0027, app._loaded_extension_info.extensions)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def test_core_extensions_present(self):"},{"line_number":65,"context_line":"        CONF.set_override(\u0027v3_api_extensions_blacklist\u0027, \u0027servers\u0027)"},{"line_number":66,"context_line":"        self.assertRaises(exception.CoreAPIMissing, compute.APIRouterV3)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2FhxI%3D","line":63,"in_reply_to":"AAAAPH%2F%2FkA0%3D","updated":"2013-05-31 07:28:41.000000000","message":"I haven\u0027t, but I agree its worth looking into","commit_id":"07ad49ceb994cdec5a01f78a804fcf14564fbc9b"},{"author":{"_account_id":5586,"name":"Ivan-Zhu","email":"zhubo198511@gmail.com","username":"ivan-zhu"},"change_message_id":"52db58b34a175a93b9287bc5c11a2cfaf46daf1a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self.assertNotIn(\u0027os-fixed-ips\u0027, app._loaded_extension_info.extensions)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def test_core_extensions_present(self):"},{"line_number":65,"context_line":"        CONF.set_override(\u0027v3_api_extensions_blacklist\u0027, \u0027servers\u0027)"},{"line_number":66,"context_line":"        self.assertRaises(exception.CoreAPIMissing, compute.APIRouterV3)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F%2FFo%3D","line":65,"updated":"2013-06-04 14:46:55.000000000","message":"Need we save the config of v3_api_extensions_blacklist first, and after the test,  recovery it? I\u0027m not sure if change this config, it will bring side-effect in the future.","commit_id":"07ad49ceb994cdec5a01f78a804fcf14564fbc9b"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"11f1686dc98205530a4a9547889c40b148d5221c","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self.assertNotIn(\u0027os-fixed-ips\u0027, app._loaded_extension_info.extensions)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def test_core_extensions_present(self):"},{"line_number":65,"context_line":"        CONF.set_override(\u0027v3_api_extensions_blacklist\u0027, \u0027servers\u0027)"},{"line_number":66,"context_line":"        self.assertRaises(exception.CoreAPIMissing, compute.APIRouterV3)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2F9PQ%3D","line":65,"in_reply_to":"AAAAPX%2F%2F%2FFo%3D","updated":"2013-06-05 07:19:30.000000000","message":"No, the config is reset before each test","commit_id":"07ad49ceb994cdec5a01f78a804fcf14564fbc9b"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"a71b37160e76771b329d20c7efd20419b363bcc1","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class ExtensionLoadingTestCase(test.TestCase):"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _reset_v3_core(self, core_extensions):"},{"line_number":61,"context_line":"        openstack.API_V3_CORE_EXTENSIONS \u003d core_extensions"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_extensions_loaded(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F4dM%3D","line":60,"updated":"2013-06-06 19:27:01.000000000","message":"This is a minor nit, but this is more of a set than a reset.","commit_id":"c7fa2cc308023dcdde9f19a43228e7b2a870c5b8"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"d90244ad6466e689826dc89f4bdcd00258c61712","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class ExtensionLoadingTestCase(test.TestCase):"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _reset_v3_core(self, core_extensions):"},{"line_number":61,"context_line":"        openstack.API_V3_CORE_EXTENSIONS \u003d core_extensions"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_extensions_loaded(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F3v4%3D","line":60,"in_reply_to":"AAAAPX%2F%2F4dM%3D","updated":"2013-06-07 00:34:01.000000000","message":"Done","commit_id":"c7fa2cc308023dcdde9f19a43228e7b2a870c5b8"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"a71b37160e76771b329d20c7efd20419b363bcc1","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":109,"context_line":"            [\u0027core1\u0027, \u0027core2\u0027])), 0)"},{"line_number":110,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":111,"context_line":"            [\u0027core1\u0027])), 1)"},{"line_number":112,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":113,"context_line":"            [])), 2)"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F4cw%3D","line":111,"updated":"2013-06-06 19:27:01.000000000","message":"Since you are using the result for logging, it would be good to test that the missing ones are returned.","commit_id":"c7fa2cc308023dcdde9f19a43228e7b2a870c5b8"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"d90244ad6466e689826dc89f4bdcd00258c61712","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":109,"context_line":"            [\u0027core1\u0027, \u0027core2\u0027])), 0)"},{"line_number":110,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":111,"context_line":"            [\u0027core1\u0027])), 1)"},{"line_number":112,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":113,"context_line":"            [])), 2)"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F3wA%3D","line":111,"in_reply_to":"AAAAPX%2F%2F4cw%3D","updated":"2013-06-07 00:34:01.000000000","message":"Done","commit_id":"c7fa2cc308023dcdde9f19a43228e7b2a870c5b8"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"d3158013b5ec9a454ff57087a1a533d7e97afb7e","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":111,"context_line":"            [\u0027core1\u0027])), 1)"},{"line_number":112,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":113,"context_line":"            [])), 2)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_core_extensions_present(self):"},{"line_number":116,"context_line":"        self.stubs.Set(stevedore.enabled, \u0027EnabledExtensionManager\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F6Fo%3D","line":113,"updated":"2013-06-06 09:09:15.000000000","message":"nit: how about adding a test case for noncore1?\n\n  ex) ..([\u0027noncore1\u0027])), 2)","commit_id":"c7fa2cc308023dcdde9f19a43228e7b2a870c5b8"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"d90244ad6466e689826dc89f4bdcd00258c61712","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":111,"context_line":"            [\u0027core1\u0027])), 1)"},{"line_number":112,"context_line":"        self.assertEqual(len(compute.APIRouterV3.get_missing_core_extensions("},{"line_number":113,"context_line":"            [])), 2)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def test_core_extensions_present(self):"},{"line_number":116,"context_line":"        self.stubs.Set(stevedore.enabled, \u0027EnabledExtensionManager\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2F3v8%3D","line":113,"in_reply_to":"AAAAPX%2F%2F6Fo%3D","updated":"2013-06-07 00:34:01.000000000","message":"Done","commit_id":"c7fa2cc308023dcdde9f19a43228e7b2a870c5b8"}]}
