)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8766,"name":"Julia Aranovich","email":"jkirnosova@mirantis.com","username":"CesarSar"},"change_message_id":"d05006044e196b96e3036e7290038f1fcd1c41b5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[RFC] Split @content decorator"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Decorato content does too many different actions, so"},{"line_number":10,"context_line":"let\u0027s split it into 3 decorators: @handle_errors,"},{"line_number":11,"context_line":"@validate and @serialize."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bacf61ea_48e4bf3a","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":8},"updated":"2016-07-27 13:55:44.000000000","message":"typo","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"}],"nailgun/nailgun/api/v1/handlers/base.py":[{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"54831a4d85b6f799e38c6d16831245dfe5096ae5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"dada55a8_901807d5","updated":"2016-07-26 14:02:43.000000000","message":"It will be nice to have an ability to provide custom response headers","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"37a2b36266d409f8bb212ac43add08f6eb251426","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        raise"},{"line_number":269,"context_line":"    except web.HTTPError as http_error:"},{"line_number":270,"context_line":"        if http_error.status_code !\u003d 204:"},{"line_number":271,"context_line":"            web.header(\u0027Content-Type\u0027, \u0027application/json\u0027, unique\u003dTrue)"},{"line_number":272,"context_line":"        if http_error.status_code \u003e\u003d 400:"},{"line_number":273,"context_line":"            http_error.data \u003d json_resp({"},{"line_number":274,"context_line":"                \"message\": http_error.data,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_0132f95d","line":271,"range":{"start_line":271,"start_character":0,"end_line":271,"end_character":71},"updated":"2016-07-26 16:27:29.000000000","message":"Fixed content-type","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"54831a4d85b6f799e38c6d16831245dfe5096ae5","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    return resp"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"def serialize(*args, **kwargs):"},{"line_number":343,"context_line":"    \"\"\"Set context-type of response based on Accept header"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    This decorator checks Accept header received from client"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_70747335","line":342,"updated":"2016-07-26 14:02:43.000000000","message":"it will be nice to have ability to provide custom serializer at handler-level defined not only by mime-type","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"37a2b36266d409f8bb212ac43add08f6eb251426","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    return resp"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"def serialize(*args, **kwargs):"},{"line_number":343,"context_line":"    \"\"\"Set context-type of response based on Accept header"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    This decorator checks Accept header received from client"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_897bb5bd","line":342,"in_reply_to":"dada55a8_70747335","updated":"2016-07-26 16:27:29.000000000","message":"revoking my comment, mime-type approach is OK","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"37a2b36266d409f8bb212ac43add08f6eb251426","unresolved":false,"context_lines":[{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    @decorator"},{"line_number":370,"context_line":"    def wrapper(func, cls, *args, **kwargs):"},{"line_number":371,"context_line":"        accept \u003d web.ctx.env.get(\"HTTP_ACCEPT\", \"application/json\")"},{"line_number":372,"context_line":"        accepted_types \u003d ["},{"line_number":373,"context_line":"            \"application/json\","},{"line_number":374,"context_line":"            \"*/*\""}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_44708472","line":371,"range":{"start_line":371,"start_character":48,"end_line":371,"end_character":66},"updated":"2016-07-26 16:27:29.000000000","message":"magic","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"},{"author":{"_account_id":18205,"name":"Bulat Gaifullin","email":"gaifullinbf@gmail.com","username":"bgaifullin"},"change_message_id":"9647ce3e4c61f3818ace04a9ebec1e093aff9d6d","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    and returns corresponding wrapper (only JSON is currently"},{"line_number":359,"context_line":"    supported). It can be used as is:"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    @handle_errors"},{"line_number":362,"context_line":"    @validate"},{"line_number":363,"context_line":"    @serialize"},{"line_number":364,"context_line":"    def GET(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"1ac06dbe_c1c66048","line":361,"range":{"start_line":361,"start_character":5,"end_line":361,"end_character":18},"updated":"2016-08-22 14:26:16.000000000","message":"the order of this decorators are important, so it will be more useful to have one:\n\n@handler(serialize\u003dTrue, error_handling\u003dTrue, validate\u003dTrue)\n\nthis will help to avoid case when user should care about order of decorators.","commit_id":"6e31938a0fff264200ddad235ed57398d3ffcb02"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"c62c6339f2ebf7e80381d0e40f25841710d48655","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    and returns corresponding wrapper (only JSON is currently"},{"line_number":359,"context_line":"    supported). It can be used as is:"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    @handle_errors"},{"line_number":362,"context_line":"    @validate"},{"line_number":363,"context_line":"    @serialize"},{"line_number":364,"context_line":"    def GET(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"1ac06dbe_67c85c23","line":361,"range":{"start_line":361,"start_character":5,"end_line":361,"end_character":18},"in_reply_to":"1ac06dbe_c1c66048","updated":"2016-08-22 14:59:04.000000000","message":"Changing order of validate and serialize won\u0027t change behaviour. handle_errors also could be used even after serialize and in this case it simply will not handle errors from serialze.","commit_id":"6e31938a0fff264200ddad235ed57398d3ffcb02"}],"nailgun/nailgun/api/v1/handlers/capacity.py":[{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"54831a4d85b6f799e38c6d16831245dfe5096ae5","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from nailgun import objects"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from nailgun.api.v1.handlers.base import BaseHandler"},{"line_number":29,"context_line":"from nailgun.api.v1.handlers.base import handle_errors"},{"line_number":30,"context_line":"from nailgun.api.v1.handlers.base import serialize"},{"line_number":31,"context_line":"from nailgun.api.v1.handlers.base import validate"},{"line_number":32,"context_line":"from nailgun.task.manager import GenerateCapacityLogTaskManager"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_306f9b2c","line":31,"range":{"start_line":29,"start_character":0,"end_line":31,"end_character":49},"updated":"2016-07-26 14:02:43.000000000","message":"IMHO it will be better to move decorators to separate decorators.py or smth like this, it will be a good clue what this imports about.","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"}],"nailgun/nailgun/api/v1/handlers/decorators.py":[{"author":{"_account_id":21013,"name":"Georgy Kibardin","email":"gkibardin@mirantis.com","username":"gkibardin"},"change_message_id":"57f206f0b8eee3f6faf874627f3470ce1a29d909","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def json_resp(data):"},{"line_number":29,"context_line":"    if isinstance(data, (dict, list)) or data is None:"},{"line_number":30,"context_line":"        return jsonutils.dumps(data)"},{"line_number":31,"context_line":"    else:"},{"line_number":32,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_81f2ac6d","line":29,"updated":"2016-07-29 06:57:30.000000000","message":"I would suggest unconditionally convert data to json. In case it is required to return arbitrary string just do not use the decorator.","commit_id":"3d34861e2f8d52ea720d6e6ab2e67d4558ef93e3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"ca9edf43a3ef88197519bb196c1427f98ec46939","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def json_resp(data):"},{"line_number":29,"context_line":"    if isinstance(data, (dict, list)) or data is None:"},{"line_number":30,"context_line":"        return jsonutils.dumps(data)"},{"line_number":31,"context_line":"    else:"},{"line_number":32,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_47af2181","line":29,"in_reply_to":"bacf61ea_81f2ac6d","updated":"2016-07-29 08:55:39.000000000","message":"Yes, it\u0027s exactly what I wanted to do, but in the next patch, because this one is already too big.","commit_id":"3d34861e2f8d52ea720d6e6ab2e67d4558ef93e3"},{"author":{"_account_id":21013,"name":"Georgy Kibardin","email":"gkibardin@mirantis.com","username":"gkibardin"},"change_message_id":"57f206f0b8eee3f6faf874627f3470ce1a29d909","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    return resp"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def serialize(*args, **kwargs):"},{"line_number":118,"context_line":"    \"\"\"Set context-type of response based on Accept header"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    This decorator checks Accept header received from client"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_a1bd306a","line":117,"updated":"2016-07-29 06:57:30.000000000","message":"Just to write down what we have agreen on\nLets call it to_json","commit_id":"3d34861e2f8d52ea720d6e6ab2e67d4558ef93e3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"@decorator"},{"line_number":74,"context_line":"def validate(func, cls, *args, **kwargs):"},{"line_number":75,"context_line":"    from nailgun.api.v1.handlers.base import BaseHandler"},{"line_number":76,"context_line":"    from nailgun.api.v1.handlers.base import CollectionHandler"},{"line_number":77,"context_line":"    request_validate_needed \u003d True"},{"line_number":78,"context_line":"    response_validate_needed \u003d True"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_f3d4a9ec","line":76,"range":{"start_line":75,"start_character":4,"end_line":76,"end_character":62},"updated":"2016-08-11 17:17:24.000000000","message":"Circular dep?","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"@decorator"},{"line_number":74,"context_line":"def validate(func, cls, *args, **kwargs):"},{"line_number":75,"context_line":"    from nailgun.api.v1.handlers.base import BaseHandler"},{"line_number":76,"context_line":"    from nailgun.api.v1.handlers.base import CollectionHandler"},{"line_number":77,"context_line":"    request_validate_needed \u003d True"},{"line_number":78,"context_line":"    response_validate_needed \u003d True"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_0d78152b","line":76,"range":{"start_line":75,"start_character":4,"end_line":76,"end_character":62},"in_reply_to":"9ad45d7e_f3d4a9ec","updated":"2016-08-12 09:51:31.000000000","message":"yep :(\n\nMaybe it\u0027s better to keep this stuff in base.py?","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":74,"context_line":"def validate(func, cls, *args, **kwargs):"},{"line_number":75,"context_line":"    from nailgun.api.v1.handlers.base import BaseHandler"},{"line_number":76,"context_line":"    from nailgun.api.v1.handlers.base import CollectionHandler"},{"line_number":77,"context_line":"    request_validate_needed \u003d True"},{"line_number":78,"context_line":"    response_validate_needed \u003d True"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    resource_type \u003d \"single\""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_73b9d9cb","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":27},"updated":"2016-08-11 17:17:24.000000000","message":"request_validation_needed?","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":74,"context_line":"def validate(func, cls, *args, **kwargs):"},{"line_number":75,"context_line":"    from nailgun.api.v1.handlers.base import BaseHandler"},{"line_number":76,"context_line":"    from nailgun.api.v1.handlers.base import CollectionHandler"},{"line_number":77,"context_line":"    request_validate_needed \u003d True"},{"line_number":78,"context_line":"    response_validate_needed \u003d True"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    resource_type \u003d \"single\""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_b0295ef5","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":27},"in_reply_to":"9ad45d7e_73b9d9cb","updated":"2016-08-12 09:51:31.000000000","message":"Done","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    from nailgun.api.v1.handlers.base import BaseHandler"},{"line_number":76,"context_line":"    from nailgun.api.v1.handlers.base import CollectionHandler"},{"line_number":77,"context_line":"    request_validate_needed \u003d True"},{"line_number":78,"context_line":"    response_validate_needed \u003d True"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    resource_type \u003d \"single\""},{"line_number":81,"context_line":"    if issubclass("}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_d3c88557","line":78,"range":{"start_line":78,"start_character":4,"end_line":78,"end_character":28},"updated":"2016-08-11 17:17:24.000000000","message":"response_validation_needed?","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    from nailgun.api.v1.handlers.base import BaseHandler"},{"line_number":76,"context_line":"    from nailgun.api.v1.handlers.base import CollectionHandler"},{"line_number":77,"context_line":"    request_validate_needed \u003d True"},{"line_number":78,"context_line":"    response_validate_needed \u003d True"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    resource_type \u003d \"single\""},{"line_number":81,"context_line":"    if issubclass("}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_902edaf8","line":78,"range":{"start_line":78,"start_character":4,"end_line":78,"end_character":28},"in_reply_to":"9ad45d7e_d3c88557","updated":"2016-08-12 09:51:31.000000000","message":"Done","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    if ("},{"line_number":88,"context_line":"        func.func_name in (\"GET\", \"DELETE\") or"},{"line_number":89,"context_line":"        getattr(cls.__class__, \u0027validator\u0027, None) is None or"},{"line_number":90,"context_line":"        resource_type \u003d\u003d \"single\" and not cls.validator.single_schema or"},{"line_number":91,"context_line":"        resource_type \u003d\u003d \"collection\" and not cls.validator.collection_schema"},{"line_number":92,"context_line":"    ):"},{"line_number":93,"context_line":"        request_validate_needed \u003d False"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_339f6160","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":69},"updated":"2016-08-11 17:17:24.000000000","message":"add braces, please, very fragile to the boolean operators priority","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    if ("},{"line_number":88,"context_line":"        func.func_name in (\"GET\", \"DELETE\") or"},{"line_number":89,"context_line":"        getattr(cls.__class__, \u0027validator\u0027, None) is None or"},{"line_number":90,"context_line":"        resource_type \u003d\u003d \"single\" and not cls.validator.single_schema or"},{"line_number":91,"context_line":"        resource_type \u003d\u003d \"collection\" and not cls.validator.collection_schema"},{"line_number":92,"context_line":"    ):"},{"line_number":93,"context_line":"        request_validate_needed \u003d False"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_d0385240","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":69},"in_reply_to":"9ad45d7e_339f6160","updated":"2016-08-12 09:51:31.000000000","message":"Done","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        func.func_name in (\"GET\", \"DELETE\") or"},{"line_number":89,"context_line":"        getattr(cls.__class__, \u0027validator\u0027, None) is None or"},{"line_number":90,"context_line":"        resource_type \u003d\u003d \"single\" and not cls.validator.single_schema or"},{"line_number":91,"context_line":"        resource_type \u003d\u003d \"collection\" and not cls.validator.collection_schema"},{"line_number":92,"context_line":"    ):"},{"line_number":93,"context_line":"        request_validate_needed \u003d False"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_93844d0b","line":91,"range":{"start_line":91,"start_character":8,"end_line":91,"end_character":77},"updated":"2016-08-11 17:17:24.000000000","message":"ditto","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        func.func_name in (\"GET\", \"DELETE\") or"},{"line_number":89,"context_line":"        getattr(cls.__class__, \u0027validator\u0027, None) is None or"},{"line_number":90,"context_line":"        resource_type \u003d\u003d \"single\" and not cls.validator.single_schema or"},{"line_number":91,"context_line":"        resource_type \u003d\u003d \"collection\" and not cls.validator.collection_schema"},{"line_number":92,"context_line":"    ):"},{"line_number":93,"context_line":"        request_validate_needed \u003d False"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_103b0a3a","line":91,"range":{"start_line":91,"start_character":8,"end_line":91,"end_character":77},"in_reply_to":"9ad45d7e_93844d0b","updated":"2016-08-12 09:51:31.000000000","message":"Done","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    if all(["},{"line_number":104,"context_line":"        settings.DEVELOPMENT,"},{"line_number":105,"context_line":"        response_validate_needed,"},{"line_number":106,"context_line":"        getattr(cls.__class__, \u0027validator\u0027, None) is not None"},{"line_number":107,"context_line":"    ]):"},{"line_number":108,"context_line":"        BaseHandler.checked_data("},{"line_number":109,"context_line":"            cls.validator.validate_response,"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_d35c054d","line":106,"range":{"start_line":106,"start_character":49,"end_line":106,"end_character":61},"updated":"2016-08-11 17:17:24.000000000","message":"not needed","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    if all(["},{"line_number":104,"context_line":"        settings.DEVELOPMENT,"},{"line_number":105,"context_line":"        response_validate_needed,"},{"line_number":106,"context_line":"        getattr(cls.__class__, \u0027validator\u0027, None) is not None"},{"line_number":107,"context_line":"    ]):"},{"line_number":108,"context_line":"        BaseHandler.checked_data("},{"line_number":109,"context_line":"            cls.validator.validate_response,"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_504582b1","line":106,"range":{"start_line":106,"start_character":49,"end_line":106,"end_character":61},"in_reply_to":"9ad45d7e_d35c054d","updated":"2016-08-12 09:51:31.000000000","message":"Done","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        response_validate_needed,"},{"line_number":106,"context_line":"        getattr(cls.__class__, \u0027validator\u0027, None) is not None"},{"line_number":107,"context_line":"    ]):"},{"line_number":108,"context_line":"        BaseHandler.checked_data("},{"line_number":109,"context_line":"            cls.validator.validate_response,"},{"line_number":110,"context_line":"            resource_type\u003dresource_type"},{"line_number":111,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_0e46744e","line":108,"updated":"2016-08-11 17:17:24.000000000","message":"Any sense in:\n\nresp \u003d BaseHandler.checked_data(\n....\n\n?","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        response_validate_needed,"},{"line_number":106,"context_line":"        getattr(cls.__class__, \u0027validator\u0027, None) is not None"},{"line_number":107,"context_line":"    ]):"},{"line_number":108,"context_line":"        BaseHandler.checked_data("},{"line_number":109,"context_line":"            cls.validator.validate_response,"},{"line_number":110,"context_line":"            resource_type\u003dresource_type"},{"line_number":111,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_307bae2b","line":108,"in_reply_to":"9ad45d7e_0e46744e","updated":"2016-08-12 09:51:31.000000000","message":"I doubt it worked, here is the only response validator:\n\n    @classmethod\n    def validate_response(cls, resp, resource_type,\n                          single_schema\u003dNone,\n                          collection_schema\u003dNone):\n        pass\n\nAt least we have to pass data to validator.\nI just copy-pasted this code from the old @content decorator, I haven\u0027t changed it.\n\nIt would be great to refactor this code, and also handle_errors, but this patch is too big already.","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"@decorator"},{"line_number":124,"context_line":"def serialize(func, cls, *args, **kwargs):"},{"line_number":125,"context_line":"    \"\"\"Set context-type of response based on Accept header"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    This decorator checks Accept header received from client"},{"line_number":128,"context_line":"    and returns corresponding wrapper (only JSON is currently"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_f3230954","line":125,"updated":"2016-08-11 17:17:24.000000000","message":"minor: dot","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"@decorator"},{"line_number":124,"context_line":"def serialize(func, cls, *args, **kwargs):"},{"line_number":125,"context_line":"    \"\"\"Set context-type of response based on Accept header"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    This decorator checks Accept header received from client"},{"line_number":128,"context_line":"    and returns corresponding wrapper (only JSON is currently"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_90153a9d","line":125,"in_reply_to":"9ad45d7e_f3230954","updated":"2016-08-12 09:51:31.000000000","message":"Done","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        ..."},{"line_number":136,"context_line":"    \"\"\""},{"line_number":137,"context_line":"    from nailgun.api.v1.handlers.base import BaseHandler"},{"line_number":138,"context_line":"    accepted_types \u003d ["},{"line_number":139,"context_line":"        \"application/json\","},{"line_number":140,"context_line":"        \"application/x-yaml\","},{"line_number":141,"context_line":"        \"*/*\""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_13fe9dad","line":138,"range":{"start_line":138,"start_character":21,"end_line":138,"end_character":22},"updated":"2016-08-11 17:17:24.000000000","message":"Tuple?","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        ..."},{"line_number":136,"context_line":"    \"\"\""},{"line_number":137,"context_line":"    from nailgun.api.v1.handlers.base import BaseHandler"},{"line_number":138,"context_line":"    accepted_types \u003d ["},{"line_number":139,"context_line":"        \"application/json\","},{"line_number":140,"context_line":"        \"application/x-yaml\","},{"line_number":141,"context_line":"        \"*/*\""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_d00fb286","line":138,"range":{"start_line":138,"start_character":21,"end_line":138,"end_character":22},"in_reply_to":"9ad45d7e_13fe9dad","updated":"2016-08-12 09:51:31.000000000","message":"Done","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"}],"nailgun/nailgun/api/v1/handlers/logs.py":[{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"37a2b36266d409f8bb212ac43add08f6eb251426","unresolved":false,"context_lines":[{"line_number":411,"context_line":"class LogPackageDefaultConfig(BaseHandler):"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    @handle_errors"},{"line_number":414,"context_line":"    @validate"},{"line_number":415,"context_line":"    @serialize"},{"line_number":416,"context_line":"    def GET(self):"},{"line_number":417,"context_line":"        \"\"\"Generates default config for snapshot"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_21245d0b","line":414,"range":{"start_line":414,"start_character":5,"end_line":414,"end_character":13},"updated":"2016-07-26 16:27:29.000000000","message":"redundant","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"37a2b36266d409f8bb212ac43add08f6eb251426","unresolved":false,"context_lines":[{"line_number":425,"context_line":"    \"\"\"Log source collection handler\"\"\""},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    @handle_errors"},{"line_number":428,"context_line":"    @validate"},{"line_number":429,"context_line":"    @serialize"},{"line_number":430,"context_line":"    def GET(self):"},{"line_number":431,"context_line":"        \"\"\":returns: Collection of log sources (from settings)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_e18405d4","line":428,"range":{"start_line":428,"start_character":5,"end_line":428,"end_character":13},"updated":"2016-07-26 16:27:29.000000000","message":"redundant","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"}],"nailgun/nailgun/api/v1/handlers/node.py":[{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"37a2b36266d409f8bb212ac43add08f6eb251426","unresolved":false,"context_lines":[{"line_number":241,"context_line":"    \"\"\"Node allocation stats handler\"\"\""},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    @handle_errors"},{"line_number":244,"context_line":"    @validate"},{"line_number":245,"context_line":"    @serialize"},{"line_number":246,"context_line":"    def GET(self):"},{"line_number":247,"context_line":"        \"\"\":returns: Total and unallocated nodes count."}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_a165ed45","line":244,"range":{"start_line":244,"start_character":5,"end_line":244,"end_character":13},"updated":"2016-07-26 16:27:29.000000000","message":"redundant","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"}],"nailgun/nailgun/api/v1/handlers/release.py":[{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"37a2b36266d409f8bb212ac43add08f6eb251426","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    validator \u003d ReleaseValidator"},{"line_number":84,"context_line":"    collection \u003d ReleaseCollection"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @handle_errors"},{"line_number":87,"context_line":"    @validate"},{"line_number":88,"context_line":"    @serialize"},{"line_number":89,"context_line":"    def GET(self):"},{"line_number":90,"context_line":"        \"\"\":returns: Sorted releases\u0027 collection in JSON format"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_be318c0d","line":87,"range":{"start_line":86,"start_character":0,"end_line":87,"end_character":13},"updated":"2016-07-26 16:27:29.000000000","message":"redundant","commit_id":"460f87cf6f276c941355d985d4d6abc8f9bb6652"}],"nailgun/nailgun/test/unit/test_handlers.py":[{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"bd8ecdbf5209568fb336262a9eea9be21b177989","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nailgun.test.base import BaseIntegrationTest"},{"line_number":26,"context_line":"from nailgun.utils import reverse"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class TestHandlers(BaseIntegrationTest):"},{"line_number":30,"context_line":"    def test_all_api_urls_404_or_405(self):"},{"line_number":31,"context_line":"        urls \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_ce70dc74","line":28,"updated":"2016-08-11 17:17:24.000000000","message":"Please, add test when you are making output of something not json-serializable","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"165fc2802ea9c6a35f76ed28fa3d933cd2f5fcdf","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nailgun.test.base import BaseIntegrationTest"},{"line_number":26,"context_line":"from nailgun.utils import reverse"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class TestHandlers(BaseIntegrationTest):"},{"line_number":30,"context_line":"    def test_all_api_urls_404_or_405(self):"},{"line_number":31,"context_line":"        urls \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_9c4a67ab","line":28,"in_reply_to":"9ad45d7e_89acf08d","updated":"2016-08-12 13:33:51.000000000","message":"Done","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":19158,"name":"Ilya Kutukov","email":"post.ilya@gmail.com","username":"ikutukov"},"change_message_id":"b4c8fb4dca85b0de77bffcd181be2dd57dfcff58","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nailgun.test.base import BaseIntegrationTest"},{"line_number":26,"context_line":"from nailgun.utils import reverse"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class TestHandlers(BaseIntegrationTest):"},{"line_number":30,"context_line":"    def test_all_api_urls_404_or_405(self):"},{"line_number":31,"context_line":"        urls \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_89acf08d","line":28,"in_reply_to":"9ad45d7e_90f1ba6d","updated":"2016-08-12 11:45:49.000000000","message":"Yes, its interesting what will be if we are returning something not-serializable from handler","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"96940946f6c73664a585782fb0274c22878ee8bf","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nailgun.test.base import BaseIntegrationTest"},{"line_number":26,"context_line":"from nailgun.utils import reverse"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class TestHandlers(BaseIntegrationTest):"},{"line_number":30,"context_line":"    def test_all_api_urls_404_or_405(self):"},{"line_number":31,"context_line":"        urls \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_90f1ba6d","line":28,"in_reply_to":"9ad45d7e_ce70dc74","updated":"2016-08-12 09:51:31.000000000","message":"Do you mean, that I need to check, that correct http error occurs?","commit_id":"6ec8cc4133a1f5c2ddbdd2ad7c3725bd66ca26d3"}]}
