)]}'
{"keystone/common/serializer.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"096010c72343e2e1e99d0060a28b8f125f12d43b","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def use_etree():"},{"line_number":50,"context_line":"    if etree is None:"},{"line_number":51,"context_line":"        raise exception.UnexpectedError()"},{"line_number":52,"context_line":"    return etree"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"PARSER \u003d use_etree().XMLParser("}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_9d04f814","line":51,"updated":"2014-08-04 21:28:16.000000000","message":"Would it be possible to log the error so that operator knows that lxml isn\u0027t installed?","commit_id":"030becf14f2a32f0376e1243fe7f30717942f922"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7602e399ed619bf586fbfd70cdec088a32bb5c9e","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def use_etree():"},{"line_number":50,"context_line":"    if etree is None:"},{"line_number":51,"context_line":"        raise exception.UnexpectedError()"},{"line_number":52,"context_line":"    return etree"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"PARSER \u003d use_etree().XMLParser("}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_41cfdab2","line":51,"in_reply_to":"baada198_9d04f814","updated":"2014-08-04 23:55:27.000000000","message":"Done in next patch set","commit_id":"030becf14f2a32f0376e1243fe7f30717942f922"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"096010c72343e2e1e99d0060a28b8f125f12d43b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        raise exception.UnexpectedError()"},{"line_number":52,"context_line":"    return etree"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"PARSER \u003d use_etree().XMLParser("},{"line_number":55,"context_line":"    resolve_entities\u003dFalse,"},{"line_number":56,"context_line":"    remove_comments\u003dTrue,"},{"line_number":57,"context_line":"    remove_pis\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_5d2500ac","line":54,"updated":"2014-08-04 21:28:16.000000000","message":"This will bring us back to having the exception raised when this module is imported. Can we lazily create the parser and entity type? Or create them in the class that will actually used them.","commit_id":"030becf14f2a32f0376e1243fe7f30717942f922"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7602e399ed619bf586fbfd70cdec088a32bb5c9e","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        raise exception.UnexpectedError()"},{"line_number":52,"context_line":"    return etree"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"PARSER \u003d use_etree().XMLParser("},{"line_number":55,"context_line":"    resolve_entities\u003dFalse,"},{"line_number":56,"context_line":"    remove_comments\u003dTrue,"},{"line_number":57,"context_line":"    remove_pis\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_21dd866d","line":54,"in_reply_to":"baada198_5d2500ac","updated":"2014-08-04 23:55:27.000000000","message":"Good point, I\u0027ll work on getting another patch up.","commit_id":"030becf14f2a32f0376e1243fe7f30717942f922"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"03117b78ddf625e3fe8163199f9ca8d4394c2abf","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self):"},{"line_number":70,"context_line":"        if etree is None:"},{"line_number":71,"context_line":"            raise exception.UnexpectedError()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        self.parser \u003d etree.XMLParser(resolve_entities\u003dFalse,"},{"line_number":74,"context_line":"                                      remove_comments\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_bc686d89","line":71,"updated":"2014-08-07 13:34:34.000000000","message":"I almost forgot. We should add a log statement here saying that this is failing because lxml isn\u0027t install. That way operators know what to fix.","commit_id":"9a192538242c7bf35dd74425effb3e5a329c6c4e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"03117b78ddf625e3fe8163199f9ca8d4394c2abf","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __init__(self):"},{"line_number":193,"context_line":"        if etree is None:"},{"line_number":194,"context_line":"            raise exception.UnexpectedError()"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def __call__(self, d, xmlns\u003dNone):"},{"line_number":197,"context_line":"        \"\"\"Returns an xml etree populated by the given dictionary."}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_1c05d9c0","line":194,"updated":"2014-08-07 13:34:34.000000000","message":"Same here.","commit_id":"9a192538242c7bf35dd74425effb3e5a329c6c4e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"dec6ff0c14f72c334b5b39064fcbef8c6863208b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def __init__(self):"},{"line_number":73,"context_line":"        if etree is None:"},{"line_number":74,"context_line":"            LOG.warning(\u0027lxml not installed\u0027)"},{"line_number":75,"context_line":"            raise exception.UnexpectedError()"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.parser \u003d etree.XMLParser(resolve_entities\u003dFalse,"},{"line_number":78,"context_line":"                                      remove_comments\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_43090531","line":75,"updated":"2014-08-08 14:38:34.000000000","message":"you can log this as a warning if you\u0027d like, but this is missing i18n and the message should be passed to the exception object so that it can be exposed to the API in debug mode\n\n  raise exception.UnexpectedError(_(\u0027lxml is not installed\u0027_)","commit_id":"ed1b10f280452b73b29d417575fd6b32268a55bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dd570319f2b2fa05be71cae5816e4065ed282155","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def __init__(self):"},{"line_number":73,"context_line":"        if etree is None:"},{"line_number":74,"context_line":"            LOG.warning(\u0027lxml not installed\u0027)"},{"line_number":75,"context_line":"            raise exception.UnexpectedError()"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.parser \u003d etree.XMLParser(resolve_entities\u003dFalse,"},{"line_number":78,"context_line":"                                      remove_comments\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_1f9ac712","line":75,"in_reply_to":"baada198_43090531","updated":"2014-08-11 13:27:26.000000000","message":"addressed in https://review.openstack.org/#/c/113255/1","commit_id":"ed1b10f280452b73b29d417575fd6b32268a55bd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"dec6ff0c14f72c334b5b39064fcbef8c6863208b","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    def __init__(self):"},{"line_number":197,"context_line":"        if etree is None:"},{"line_number":198,"context_line":"            LOG.warning(\u0027lxml not installed\u0027)"},{"line_number":199,"context_line":"            raise exception.UnexpectedError()"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def __call__(self, d, xmlns\u003dNone):"},{"line_number":202,"context_line":"        \"\"\"Returns an xml etree populated by the given dictionary."}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_1e568205","line":199,"updated":"2014-08-08 14:38:34.000000000","message":"same as above","commit_id":"ed1b10f280452b73b29d417575fd6b32268a55bd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dd570319f2b2fa05be71cae5816e4065ed282155","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    def __init__(self):"},{"line_number":197,"context_line":"        if etree is None:"},{"line_number":198,"context_line":"            LOG.warning(\u0027lxml not installed\u0027)"},{"line_number":199,"context_line":"            raise exception.UnexpectedError()"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def __call__(self, d, xmlns\u003dNone):"},{"line_number":202,"context_line":"        \"\"\"Returns an xml etree populated by the given dictionary."}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_5f87dfb5","line":199,"in_reply_to":"baada198_1e568205","updated":"2014-08-11 13:27:26.000000000","message":"addressed in https://review.openstack.org/#/c/113255/1","commit_id":"ed1b10f280452b73b29d417575fd6b32268a55bd"}],"keystone/middleware/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7ebbc00d52e6d4f5b8b886300a336cd0357d40a9","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        self.xmlns \u003d None"},{"line_number":161,"context_line":"        if importutils.try_import(\u0027lxml\u0027) is None:"},{"line_number":162,"context_line":"            raise ImportError(\u0027Could not import lxml\u0027)"},{"line_number":163,"context_line":"        self.serializer \u003d importutils.try_import(\u0027keystone.common.serializer\u0027)"},{"line_number":164,"context_line":"        if self.serializer is None:"},{"line_number":165,"context_line":"            raise ImportError(\u0027Could not import serializer\u0027)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_7e068575","line":163,"updated":"2014-08-01 17:45:00.000000000","message":"Won\u0027t we always get an error for keystone.common.serializer, if we fail to import lxml?","commit_id":"ef22027f993ba94373e28012615bfac1a6630bb0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"09b45e6139ef93fa98c890d9317e1053c77b9773","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        self.xmlns \u003d None"},{"line_number":161,"context_line":"        if importutils.try_import(\u0027lxml\u0027) is None:"},{"line_number":162,"context_line":"            raise ImportError(\u0027Could not import lxml\u0027)"},{"line_number":163,"context_line":"        self.serializer \u003d importutils.try_import(\u0027keystone.common.serializer\u0027)"},{"line_number":164,"context_line":"        if self.serializer is None:"},{"line_number":165,"context_line":"            raise ImportError(\u0027Could not import serializer\u0027)"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_998293c5","line":163,"in_reply_to":"baada198_7e068575","updated":"2014-08-01 18:00:52.000000000","message":"Yes, so here we check it we can import \u0027lxml\u0027, if we can\u0027t then raise. If we can import \u0027lxml\u0027 then we go ahead and try importing \u0027keystone.common.serializer\u0027, if self.serializer is None, then the import failed on something else that isn\u0027t \u0027lxml\u0027. By testing if we can import \u0027lxml\u0027 first we can say \"Hey, we can\u0027t import \u0027lxml\u0027 so we can\u0027t import \u0027keystone.common.serializer\u0027 anyway, bombing out!\" versus bombing out when importing serializer due to a dependency issue within serializer. We can be more descriptive.\n\n    if importutils.try_import(\u0027keystone.common.serializer\u0027):\n        # we will fail here if \u0027lxml\u0027 can\u0027t be installed on the system. By\n        # checking if \u0027lxml\u0027 is actually the real issue and reporting that to\n        # the user because \"lxml import fails, hence serializer *will* fail\"\n        # is more descriptive to the user than \"serializer import failed, not sure why\"","commit_id":"ef22027f993ba94373e28012615bfac1a6630bb0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0b0eed926261e0f4621620f224a4a40ddf7e16ef","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":158,"context_line":"        super(XmlBodyMiddleware, self).__init__(*args, **kwargs)"},{"line_number":159,"context_line":"        self.xmlns \u003d None"},{"line_number":160,"context_line":"        from keystone.common import serializer"},{"line_number":161,"context_line":"        self.serializer \u003d serializer"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def process_request(self, request):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_0256d95d","line":160,"updated":"2014-08-04 13:13:52.000000000","message":"do all your imports at the top of the module","commit_id":"3dab259275598e7e7cb7ce1553c6eb152e380396"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"07b533b44204ed355813a6a5d4c82e2c9b1c7eb3","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":158,"context_line":"        super(XmlBodyMiddleware, self).__init__(*args, **kwargs)"},{"line_number":159,"context_line":"        self.xmlns \u003d None"},{"line_number":160,"context_line":"        from keystone.common import serializer"},{"line_number":161,"context_line":"        self.serializer \u003d serializer"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def process_request(self, request):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_4c9478e7","line":160,"in_reply_to":"baada198_0256d95d","updated":"2014-08-04 20:03:41.000000000","message":"Done","commit_id":"3dab259275598e7e7cb7ce1553c6eb152e380396"}],"keystone/tests/test_serializer.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b46b5ee78345eab2cc2279423a8db5753259bd31","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def test_etree_import_succeeds(self):"},{"line_number":320,"context_line":"        from lxml import etree"},{"line_number":321,"context_line":"        serializer.etree \u003d etree"},{"line_number":322,"context_line":"        self.assertIsNotNone(serializer.use_etree())"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def test_etree_import_fails(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_18c39658","line":321,"updated":"2014-08-04 21:55:06.000000000","message":"This is bad because etree is being patched and not getting set back to the original value. This will affect other tests.","commit_id":"030becf14f2a32f0376e1243fe7f30717942f922"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b46b5ee78345eab2cc2279423a8db5753259bd31","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        self.assertIsNotNone(serializer.use_etree())"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def test_etree_import_fails(self):"},{"line_number":325,"context_line":"        serializer.etree \u003d None"},{"line_number":326,"context_line":"        self.assertRaises(exception.UnexpectedError, serializer.use_etree)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_58a0aea4","line":325,"updated":"2014-08-04 21:55:06.000000000","message":"Same problem here.","commit_id":"030becf14f2a32f0376e1243fe7f30717942f922"}]}
