)]}'
{"nova/api/openstack/extensions.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"b72cf20db8f753a1a8ceea569279187af824705b","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import functools"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_log import log as logging"},{"line_number":21,"context_line":"from oslo_utils import importutils"},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":"import webob.dec"},{"line_number":24,"context_line":"import webob.exc"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f485f77_be5a12f0","side":"PARENT","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":34},"updated":"2017-11-15 09:55:29.000000000","message":"should be removed","commit_id":"008bc4065da3fe972f1e7f3bc26cf4ca546059db"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"b72cf20db8f753a1a8ceea569279187af824705b","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import webob.dec"},{"line_number":24,"context_line":"import webob.exc"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from nova.api.openstack import wsgi"},{"line_number":27,"context_line":"from nova import exception"},{"line_number":28,"context_line":"from nova.i18n import _"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1f485f77_9e5d16eb","side":"PARENT","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":35},"updated":"2017-11-15 09:55:29.000000000","message":"ditto","commit_id":"008bc4065da3fe972f1e7f3bc26cf4ca546059db"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"de3a0b5521f16f88796c3168845a3794c88abcb7","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ExtensionDescriptor(object):"},{"line_number":34,"context_line":"    \"\"\"Base class that defines the contract for extensions."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    Note that you don\u0027t have to derive from this class to have a valid"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_696b93b6","side":"PARENT","line":33,"range":{"start_line":33,"start_character":6,"end_line":33,"end_character":25},"updated":"2017-11-16 18:56:13.000000000","message":"This class is used in\n\ntests/unit/api/openstack/compute/legacy_v2/extensions/foxinsocks.py\n 61 class Foxinsocks(extensions.ExtensionDescriptor):\n 62     \"\"\"The Fox In Socks Extension.\"\"\"\n\nand Foxinsocks also is not used at all.\nThat is the reason why any unit tests are not failed on this patch.\n\nIt is necessary to remove the Foxinsocks also.","commit_id":"008bc4065da3fe972f1e7f3bc26cf4ca546059db"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cf044dd07b7055b07fd5522db6c1ed6e26a2c043","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ExtensionDescriptor(object):"},{"line_number":34,"context_line":"    \"\"\"Base class that defines the contract for extensions."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    Note that you don\u0027t have to derive from this class to have a valid"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_fe53af37","side":"PARENT","line":33,"range":{"start_line":33,"start_character":6,"end_line":33,"end_character":25},"in_reply_to":"1f485f77_696b93b6","updated":"2017-11-17 00:27:47.000000000","message":"+1 on removing complete folder itself  tests/unit/api/openstack/compute/legacy_v2","commit_id":"008bc4065da3fe972f1e7f3bc26cf4ca546059db"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"bc862d8c287f94ef2916768684d8840e92b41165","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ExtensionDescriptor(object):"},{"line_number":34,"context_line":"    \"\"\"Base class that defines the contract for extensions."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    Note that you don\u0027t have to derive from this class to have a valid"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_93d835ef","side":"PARENT","line":33,"range":{"start_line":33,"start_character":6,"end_line":33,"end_character":25},"in_reply_to":"1f485f77_fe53af37","updated":"2017-11-29 04:55:34.000000000","message":"nice catch! I will remove them.","commit_id":"008bc4065da3fe972f1e7f3bc26cf4ca546059db"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d8b22acbb747dd4aa2fdb4e83436330cdd03cd6a","unresolved":false,"context_lines":[{"line_number":228,"context_line":"                    {\u0027ext_factory\u0027: ext_factory, \u0027exc\u0027: exc})"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"class ControllerExtension(object):"},{"line_number":232,"context_line":"    \"\"\"Extend core controllers of nova OpenStack API."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    Provide a way to extend existing nova OpenStack API core"},{"line_number":235,"context_line":"    controllers."},{"line_number":236,"context_line":"    \"\"\""},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def __init__(self, extension, collection, controller):"},{"line_number":239,"context_line":"        self.extension \u003d extension"},{"line_number":240,"context_line":"        self.collection \u003d collection"},{"line_number":241,"context_line":"        self.controller \u003d controller"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"class ResourceExtension(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_0ae4160c","side":"PARENT","line":241,"range":{"start_line":231,"start_character":0,"end_line":241,"end_character":36},"updated":"2017-12-19 18:02:40.000000000","message":"This appears to be unused now too. Want to remove it here?","commit_id":"008bc4065da3fe972f1e7f3bc26cf4ca546059db"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d8b22acbb747dd4aa2fdb4e83436330cdd03cd6a","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        self.member_name \u003d member_name"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":265,"context_line":"class V21APIExtensionBase(object):"},{"line_number":266,"context_line":"    \"\"\"Abstract base class for all v2.1 API extensions."},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    All v2.1 API extensions must derive from this class and implement"},{"line_number":269,"context_line":"    the abstract methods get_resources and get_controller_extensions"},{"line_number":270,"context_line":"    even if they just return an empty list. The extensions must also"},{"line_number":271,"context_line":"    define the abstract properties."},{"line_number":272,"context_line":"    \"\"\""},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def __init__(self, extension_info):"},{"line_number":275,"context_line":"        self.extension_info \u003d extension_info"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    @abc.abstractmethod"},{"line_number":278,"context_line":"    def get_resources(self):"},{"line_number":279,"context_line":"        \"\"\"Return a list of resources extensions."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        The extensions should return a list of ResourceExtension"},{"line_number":282,"context_line":"        objects. This list may be empty."},{"line_number":283,"context_line":"        \"\"\""},{"line_number":284,"context_line":"        pass"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    @abc.abstractmethod"},{"line_number":287,"context_line":"    def get_controller_extensions(self):"},{"line_number":288,"context_line":"        \"\"\"Return a list of controller extensions."},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        The extensions should return a list of ControllerExtension"},{"line_number":291,"context_line":"        objects. This list may be empty."},{"line_number":292,"context_line":"        \"\"\""},{"line_number":293,"context_line":"        pass"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    @abc.abstractproperty"},{"line_number":296,"context_line":"    def name(self):"},{"line_number":297,"context_line":"        \"\"\"Name of the extension.\"\"\""},{"line_number":298,"context_line":"        pass"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    @abc.abstractproperty"},{"line_number":301,"context_line":"    def alias(self):"},{"line_number":302,"context_line":"        \"\"\"Alias for the extension.\"\"\""},{"line_number":303,"context_line":"        pass"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    @abc.abstractproperty"},{"line_number":306,"context_line":"    def version(self):"},{"line_number":307,"context_line":"        \"\"\"Version of the extension.\"\"\""},{"line_number":308,"context_line":"        pass"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def __repr__(self):"},{"line_number":311,"context_line":"        return \"\u003cExtension: name\u003d%s, alias\u003d%s, version\u003d%s\u003e\" % ("},{"line_number":312,"context_line":"            self.name, self.alias, self.version)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def is_valid(self):"},{"line_number":315,"context_line":"        \"\"\"Validate required fields for extensions."},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        Raises an attribute error if the attr is not defined"},{"line_number":318,"context_line":"        \"\"\""},{"line_number":319,"context_line":"        for attr in (\u0027name\u0027, \u0027alias\u0027, \u0027version\u0027):"},{"line_number":320,"context_line":"            if getattr(self, attr) is None:"},{"line_number":321,"context_line":"                raise AttributeError(\"%s is None, needs to be defined\" % attr)"},{"line_number":322,"context_line":"        return True"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"def expected_errors(errors):"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_eae69216","side":"PARENT","line":322,"range":{"start_line":264,"start_character":0,"end_line":322,"end_character":19},"updated":"2017-12-19 18:02:40.000000000","message":"This looks like dead code","commit_id":"008bc4065da3fe972f1e7f3bc26cf4ca546059db"}],"nova/tests/unit/api/openstack/compute/legacy_v2/extensions/foxinsocks.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"79e4b915e4607172ea753e7cf1347962f67b0e22","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ff82abbf_6dd262d3","updated":"2017-11-29 14:25:27.000000000","message":"Kinda sad to lose FoxInSocks :)","commit_id":"658a82f6ab73feffa5db282564f8ed05fc7d7886"}]}
