)]}'
{"ironic/api/hooks.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"6ac4433d4e27a53c84bfad04b3b81749f97dc171","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        is_admin \u003d policy.check(\u0027admin\u0027, state.request.headers, creds)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        path \u003d utils.safe_rstrip(state.request.path, \u0027/\u0027)"},{"line_number":81,"context_line":"        is_public_api \u003d path in self.public_api_routes"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        state.request.context \u003d context.RequestContext("}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FXbk%3D","side":"PARENT","line":80,"updated":"2014-02-13 17:38:20.000000000","message":"this is the only case using utils.safe_rstrip. perhaps we should remove it","commit_id":"2780650f6eeb9f8f654a8dcd2651c5139eeb6178"},{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"261630ca5b0f30365d99b4dbd9df45a4d4cdc371","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        is_admin \u003d policy.check(\u0027admin\u0027, state.request.headers, creds)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        path \u003d utils.safe_rstrip(state.request.path, \u0027/\u0027)"},{"line_number":81,"context_line":"        is_public_api \u003d path in self.public_api_routes"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        state.request.context \u003d context.RequestContext("}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FXYw%3D","side":"PARENT","line":80,"in_reply_to":"AAAAUX%2F%2FXbk%3D","updated":"2014-02-13 17:46:31.000000000","message":"It\u0027s used in ironic/api/middleware/auth_token.py","commit_id":"2780650f6eeb9f8f654a8dcd2651c5139eeb6178"}],"ironic/api/middleware/auth_token.py":[{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"88a98ae62bd5dfc3cb4165a17f63863fefd4939f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        route_pattern_tpl \u003d \u0027%s(\\.json|\\.xml)?$\u0027"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        try:"},{"line_number":38,"context_line":"            self.public_api_routes \u003d [re.compile(route_pattern_tpl % route_tpl)"},{"line_number":39,"context_line":"                                      for route_tpl in public_api_routes]"},{"line_number":40,"context_line":"        except re.error as e:"},{"line_number":41,"context_line":"            msg \u003d _(\u0027Cannot compile public API routes: %s\u0027) % e"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2FXOY%3D","line":38,"updated":"2014-01-14 16:30:33.000000000","message":"It is also possible to combine all templates into a single regular expression instead of putting them into a list.\n\nMy idea was that this approach may cause unpredictable bugs. What do you think?","commit_id":"2296c1321fb24572493cd39c1087d9d3bde47dff"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"2e47ea1f80308d82ce70e054669818a11a9d652e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        except re.error as e:"},{"line_number":41,"context_line":"            msg \u003d _(\u0027Cannot compile public API routes: %s\u0027) % e"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"            LOG.error(msg)"},{"line_number":44,"context_line":"            raise exception.ConfigInvalid(error_msg\u003dmsg)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        super(AuthTokenMiddleware, self).__init__(app, conf)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F9fDM%3D","line":43,"updated":"2014-02-06 16:04:20.000000000","message":"For python logging, don\u0027t interpolate here. Instead do\n\nLOG.error(_(\u0027Cannot compile public API routes: %s\u0027), e)","commit_id":"7f9b32cee548ea354c900f4e825ef5f3dbf0f3de"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"bb2fd12093aece6825e0f827d32175d78b464ef1","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        except re.error as e:"},{"line_number":41,"context_line":"            msg \u003d _(\u0027Cannot compile public API routes: %s\u0027) % e"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"            LOG.error(msg)"},{"line_number":44,"context_line":"            raise exception.ConfigInvalid(error_msg\u003dmsg)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        super(AuthTokenMiddleware, self).__init__(app, conf)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FrJg%3D","line":43,"in_reply_to":"AAAAUH%2F9fDM%3D","updated":"2014-02-11 15:41:20.000000000","message":"I haven\u0027t seen error_msg\u003dmsg... Just ignore my previous comment \u003d)","commit_id":"7f9b32cee548ea354c900f4e825ef5f3dbf0f3de"}],"ironic/tests/api/test_acl.py":[{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"2e47ea1f80308d82ce70e054669818a11a9d652e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            for route in (\u0027/\u0027, \u0027/v1\u0027):"},{"line_number":88,"context_line":"                response \u003d self.get_json(route,"},{"line_number":89,"context_line":"                                         path_prefix\u003d\u0027\u0027, expect_errors\u003dTrue)"},{"line_number":90,"context_line":"                self.assertEqual(response.status_int, 200)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def test_public_api_with_path_extensions(self):"},{"line_number":93,"context_line":"        for route in (\u0027/v1/\u0027, \u0027/v1.json\u0027, \u0027/v1.xml\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F9e8I%3D","line":90,"updated":"2014-02-06 16:04:20.000000000","message":"Probably need to change the order in assertEqual, which makes this patch https://review.openstack.org/#/c/71486","commit_id":"7f9b32cee548ea354c900f4e825ef5f3dbf0f3de"},{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"261630ca5b0f30365d99b4dbd9df45a4d4cdc371","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            for route in (\u0027/\u0027, \u0027/v1\u0027):"},{"line_number":88,"context_line":"                response \u003d self.get_json(route,"},{"line_number":89,"context_line":"                                         path_prefix\u003d\u0027\u0027, expect_errors\u003dTrue)"},{"line_number":90,"context_line":"                self.assertEqual(response.status_int, 200)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def test_public_api_with_path_extensions(self):"},{"line_number":93,"context_line":"        for route in (\u0027/v1/\u0027, \u0027/v1.json\u0027, \u0027/v1.xml\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FXYg%3D","line":90,"in_reply_to":"AAAAUH%2F9e8I%3D","updated":"2014-02-13 17:46:31.000000000","message":"Done","commit_id":"7f9b32cee548ea354c900f4e825ef5f3dbf0f3de"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"2e47ea1f80308d82ce70e054669818a11a9d652e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        for route in (\u0027/v1/\u0027, \u0027/v1.json\u0027, \u0027/v1.xml\u0027):"},{"line_number":94,"context_line":"            response \u003d self.get_json(route,"},{"line_number":95,"context_line":"                                     path_prefix\u003d\u0027\u0027, expect_errors\u003dTrue)"},{"line_number":96,"context_line":"            self.assertEqual(response.status_int, 200)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F9e7c%3D","line":96,"updated":"2014-02-06 16:04:20.000000000","message":"ditto","commit_id":"7f9b32cee548ea354c900f4e825ef5f3dbf0f3de"},{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"261630ca5b0f30365d99b4dbd9df45a4d4cdc371","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        for route in (\u0027/v1/\u0027, \u0027/v1.json\u0027, \u0027/v1.xml\u0027):"},{"line_number":94,"context_line":"            response \u003d self.get_json(route,"},{"line_number":95,"context_line":"                                     path_prefix\u003d\u0027\u0027, expect_errors\u003dTrue)"},{"line_number":96,"context_line":"            self.assertEqual(response.status_int, 200)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FXYc%3D","line":96,"in_reply_to":"AAAAUH%2F9e7c%3D","updated":"2014-02-13 17:46:31.000000000","message":"Done","commit_id":"7f9b32cee548ea354c900f4e825ef5f3dbf0f3de"}]}
