)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO:"},{"line_number":16,"context_line":" - Split into 2 patches"},{"line_number":17,"context_line":" - Stevedore for loading extensions and hooks"},{"line_number":18,"context_line":" - Unittests for V2"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"NOTE:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAVn%2F%2Fqzs%3D","line":17,"updated":"2014-03-04 20:08:11.000000000","message":"Please move this to yet another change. It should be quite simple to separate this functionality.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO:"},{"line_number":16,"context_line":" - Split into 2 patches"},{"line_number":17,"context_line":" - Stevedore for loading extensions and hooks"},{"line_number":18,"context_line":" - Unittests for V2"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"NOTE:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAVn%2F%2FigA%3D","line":17,"in_reply_to":"AAAAVn%2F%2Fqzs%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":18,"context_line":" - Unittests for V2"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"NOTE:"},{"line_number":21,"context_line":" - debug in pecan config.py must be set to False in production use"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Implements blueprint: pecan-wsme"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAVn%2F%2Fqyc%3D","line":21,"updated":"2014-03-04 20:08:11.000000000","message":"This is a very bad idea. Changing something in the codebase in production is wrong. We shouldn\u0027t have one more place to configure behavior of our service. One central config file is enough.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":18,"context_line":" - Unittests for V2"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"NOTE:"},{"line_number":21,"context_line":" - debug in pecan config.py must be set to False in production use"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Implements blueprint: pecan-wsme"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAVn%2F%2Fhts%3D","line":21,"in_reply_to":"AAAAVn%2F%2Fqyc%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/api/v2/acl.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    :param conf: Climate settings."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    conf.register_opts(auth_token.opts, group\u003dOPT_GROUP_NAME)"},{"line_number":31,"context_line":"    auth_token.CONF \u003d conf"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def install(app, conf):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fquo%3D","line":31,"updated":"2014-03-04 20:08:11.000000000","message":"Monkey-patching auth_token module is bad approach. I think you should remove this line and move the previous one to the other method.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    :param conf: Climate settings."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    conf.register_opts(auth_token.opts, group\u003dOPT_GROUP_NAME)"},{"line_number":31,"context_line":"    auth_token.CONF \u003d conf"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def install(app, conf):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FigQ%3D","line":31,"in_reply_to":"AAAAVn%2F%2Fquo%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    register_opts(cfg.CONF)"},{"line_number":43,"context_line":"    keystone_config \u003d dict(conf.get(OPT_GROUP_NAME))"},{"line_number":44,"context_line":"    return auth_token.AuthProtocol(app, conf\u003dkeystone_config)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqs8%3D","line":43,"updated":"2014-03-04 20:08:11.000000000","message":"There\u0027s an inconsistency here. You register opts in global cfg.CONF but use parameters from conf argument.\n\nI think we should just use global cfg.CONF here and avoid extra argument to this method.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    register_opts(cfg.CONF)"},{"line_number":43,"context_line":"    keystone_config \u003d dict(conf.get(OPT_GROUP_NAME))"},{"line_number":44,"context_line":"    return auth_token.AuthProtocol(app, conf\u003dkeystone_config)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FigU%3D","line":43,"in_reply_to":"AAAAVn%2F%2Fqs8%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    register_opts(cfg.CONF)"},{"line_number":43,"context_line":"    keystone_config \u003d dict(conf.get(OPT_GROUP_NAME))"},{"line_number":44,"context_line":"    return auth_token.AuthProtocol(app, conf\u003dkeystone_config)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqq4%3D","line":44,"updated":"2014-03-04 20:08:11.000000000","message":"Since this module boils down to 3 lines of code and 2 imports, it should be merged into climate.api.v2.middleware.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    register_opts(cfg.CONF)"},{"line_number":43,"context_line":"    keystone_config \u003d dict(conf.get(OPT_GROUP_NAME))"},{"line_number":44,"context_line":"    return auth_token.AuthProtocol(app, conf\u003dkeystone_config)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FigI%3D","line":44,"in_reply_to":"AAAAVn%2F%2Fqq4%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/api/v2/app.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":35,"context_line":"def get_pecan_config():"},{"line_number":36,"context_line":"    # Set up the pecan configuration"},{"line_number":37,"context_line":"    filename \u003d api_config.__file__.replace(\u0027.pyc\u0027, \u0027.py\u0027)"},{"line_number":38,"context_line":"    return pecan.configuration.conf_from_file(filename)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def setup_app(pecan_config\u003dNone, extra_hooks\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXb8%3D","line":38,"updated":"2014-02-21 17:39:10.000000000","message":"There\u0027s absolutely no need for module-based configuration here. Since this config module is fixed as should not be changed during deployment (it is just some module deep in our codebase), you can just embed all those \"configuration\" values to setup_app method.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":35,"context_line":"def get_pecan_config():"},{"line_number":36,"context_line":"    # Set up the pecan configuration"},{"line_number":37,"context_line":"    filename \u003d api_config.__file__.replace(\u0027.pyc\u0027, \u0027.py\u0027)"},{"line_number":38,"context_line":"    return pecan.configuration.conf_from_file(filename)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def setup_app(pecan_config\u003dNone, extra_hooks\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F71U%3D","line":38,"in_reply_to":"AAAAUX%2F%2BXb8%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    return pecan.configuration.conf_from_file(filename)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def setup_app(pecan_config\u003dNone, extra_hooks\u003dNone):"},{"line_number":42,"context_line":"    app_hooks \u003d [hooks.ConfigHook(),"},{"line_number":43,"context_line":"                 hooks.DBHook(),"},{"line_number":44,"context_line":"                 hooks.ContextHook(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWyE%3D","line":41,"updated":"2014-02-21 17:39:10.000000000","message":"There\u0027s no need to separate setup_app and make_app.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    return pecan.configuration.conf_from_file(filename)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def setup_app(pecan_config\u003dNone, extra_hooks\u003dNone):"},{"line_number":42,"context_line":"    app_hooks \u003d [hooks.ConfigHook(),"},{"line_number":43,"context_line":"                 hooks.DBHook(),"},{"line_number":44,"context_line":"                 hooks.ContextHook(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F72A%3D","line":41,"in_reply_to":"AAAAUX%2F%2BWyE%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    if not pecan_config:"},{"line_number":51,"context_line":"        pecan_config \u003d get_pecan_config()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXWs%3D","line":53,"updated":"2014-02-21 17:39:10.000000000","message":"Since you\u0027re passing all parameters from config to make_app explicitly anyway, I don\u0027t think set_config is needed.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    if not pecan_config:"},{"line_number":51,"context_line":"        pecan_config \u003d get_pecan_config()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F74c%3D","line":53,"in_reply_to":"AAAAUX%2F%2BXWs%3D","updated":"2014-03-04 08:29:29.000000000","message":"In case of any added config flag, we still need to process it anyway","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d62ba7a01c708de825c5ae795b62bc273673219b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    if not pecan_config:"},{"line_number":51,"context_line":"        pecan_config \u003d get_pecan_config()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2FwoI%3D","line":53,"in_reply_to":"AAAAVn%2F%2F74c%3D","updated":"2014-03-04 09:00:12.000000000","message":"In that case you shouldn\u0027t passing these arguments to Pecan app. It\u0027ll get everything from config.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c026fd3ff96c16b571eef53773671c3002ef687a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    if not pecan_config:"},{"line_number":51,"context_line":"        pecan_config \u003d get_pecan_config()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2FvJI%3D","line":53,"in_reply_to":"AAAAVn%2F%2FwoI%3D","updated":"2014-03-04 17:15:49.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        static_root\u003dpecan_config.app.static_root,"},{"line_number":58,"context_line":"        template_path\u003dpecan_config.app.template_path,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWuA%3D","line":55,"updated":"2014-02-21 17:39:10.000000000","message":"You don\u0027t really use any features of make_app here. I think you can use pecan.Pecan directly here and wrap it explicitly with ParsableErrorMiddleware and auth_token middleware here.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        static_root\u003dpecan_config.app.static_root,"},{"line_number":58,"context_line":"        template_path\u003dpecan_config.app.template_path,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F7yQ%3D","line":55,"in_reply_to":"AAAAUX%2F%2BWuA%3D","updated":"2014-03-04 08:29:29.000000000","message":"See doc : \n\"Base Pecan application object. Generally created using pecan.make_app, rather than being created manually.\"\nhttp://pecan.readthedocs.org/en/latest/pecan_core.html\n\nthat\u0027s better to create apps using make_app","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d62ba7a01c708de825c5ae795b62bc273673219b","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        static_root\u003dpecan_config.app.static_root,"},{"line_number":58,"context_line":"        template_path\u003dpecan_config.app.template_path,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2Fwo8%3D","line":55,"in_reply_to":"AAAAVn%2F%2F7yQ%3D","updated":"2014-03-04 09:00:12.000000000","message":"It doesn\u0027t say that it\u0027s better to use make_app. It\u0027s just more general and can be useful for more complicated apps. For REST API all fancy stuff done by make_app is not needed at all.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c026fd3ff96c16b571eef53773671c3002ef687a","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        static_root\u003dpecan_config.app.static_root,"},{"line_number":58,"context_line":"        template_path\u003dpecan_config.app.template_path,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2FvME%3D","line":55,"in_reply_to":"AAAAVn%2F%2Fwo8%3D","updated":"2014-03-04 17:15:49.000000000","message":"Don\u0027t you think it\u0027s bikesheding, in particular with all other Openstack projects doing use of make_app() ?","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        static_root\u003dpecan_config.app.static_root,"},{"line_number":58,"context_line":"        template_path\u003dpecan_config.app.template_path,"},{"line_number":59,"context_line":"        debug\u003dCONF.debug,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXVY%3D","line":56,"updated":"2014-02-21 17:39:10.000000000","message":"You should embed all parameters here directly. No need to scatter them over two modules.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        static_root\u003dpecan_config.app.static_root,"},{"line_number":58,"context_line":"        template_path\u003dpecan_config.app.template_path,"},{"line_number":59,"context_line":"        debug\u003dCONF.debug,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F74A%3D","line":56,"in_reply_to":"AAAAUX%2F%2BXVY%3D","updated":"2014-03-04 08:29:29.000000000","message":"that\u0027s a pecan config file, I prefer to keep it","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        static_root\u003dpecan_config.app.static_root,"},{"line_number":58,"context_line":"        template_path\u003dpecan_config.app.template_path,"},{"line_number":59,"context_line":"        debug\u003dCONF.debug,"},{"line_number":60,"context_line":"        force_canonical\u003dgetattr(pecan_config.app, \u0027force_canonical\u0027, True),"},{"line_number":61,"context_line":"        hooks\u003dapp_hooks,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXQ4%3D","line":58,"updated":"2014-02-21 17:39:10.000000000","message":"These two options are not needed since we\u0027re not going to serve static files or use any templates.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        static_root\u003dpecan_config.app.static_root,"},{"line_number":58,"context_line":"        template_path\u003dpecan_config.app.template_path,"},{"line_number":59,"context_line":"        debug\u003dCONF.debug,"},{"line_number":60,"context_line":"        force_canonical\u003dgetattr(pecan_config.app, \u0027force_canonical\u0027, True),"},{"line_number":61,"context_line":"        hooks\u003dapp_hooks,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F5X4%3D","line":58,"in_reply_to":"AAAAUX%2F%2BXQ4%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        guess_content_type_from_ext\u003dFalse"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    if pecan_config.app.enable_acl:"},{"line_number":67,"context_line":"        return acl.install(app, cfg.CONF)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    return app"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWtM%3D","line":66,"updated":"2014-02-21 17:39:10.000000000","message":"I don\u0027t think we\u0027re going to support running without Keystone actually.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        guess_content_type_from_ext\u003dFalse"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    if pecan_config.app.enable_acl:"},{"line_number":67,"context_line":"        return acl.install(app, cfg.CONF)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    return app"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F730%3D","line":66,"in_reply_to":"AAAAUX%2F%2BWtM%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                 hooks.ContextHook(),"},{"line_number":43,"context_line":"                 hooks.RPCHook(),"},{"line_number":44,"context_line":"                 ]"},{"line_number":45,"context_line":"    # TODO(sbauza): Add stevedore extensions for loading hooks"},{"line_number":46,"context_line":"    extra_hooks \u003d None"},{"line_number":47,"context_line":"    if extra_hooks:"},{"line_number":48,"context_line":"        app_hooks.extend(extra_hooks)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqlE%3D","line":45,"updated":"2014-03-04 20:08:11.000000000","message":"Is there any possible usecases for adding hooks dynamically?","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                 hooks.ContextHook(),"},{"line_number":43,"context_line":"                 hooks.RPCHook(),"},{"line_number":44,"context_line":"                 ]"},{"line_number":45,"context_line":"    # TODO(sbauza): Add stevedore extensions for loading hooks"},{"line_number":46,"context_line":"    extra_hooks \u003d None"},{"line_number":47,"context_line":"    if extra_hooks:"},{"line_number":48,"context_line":"        app_hooks.extend(extra_hooks)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fies%3D","line":45,"in_reply_to":"AAAAVn%2F%2FqlE%3D","updated":"2014-03-05 16:17:19.000000000","message":"That\u0027s an excellent question. Considering these 4 above hooks as \u0027core\u0027, the idea would be to have possibilities to add extra-processing at the Pecan level on before and after() statements\n\nOf course, the ideal hook would be like Nova does, where CRUD methods are defined","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        app_hooks.extend(extra_hooks)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    filename \u003d api_config.__file__.replace(\u0027.pyc\u0027, \u0027.py\u0027)"},{"line_number":51,"context_line":"    pecan_config \u003d pecan.configuration.conf_from_file(filename)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqp0%3D","line":51,"updated":"2014-03-04 20:08:11.000000000","message":"My comment to line 38 in the previous patchset is not addressed here. We don\u0027t need module configuration loader here at all.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        app_hooks.extend(extra_hooks)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    filename \u003d api_config.__file__.replace(\u0027.pyc\u0027, \u0027.py\u0027)"},{"line_number":51,"context_line":"    pecan_config \u003d pecan.configuration.conf_from_file(filename)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FhuE%3D","line":51,"in_reply_to":"AAAAVn%2F%2Fqp0%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        debug\u003dCONF.debug,"},{"line_number":58,"context_line":"        hooks\u003dapp_hooks,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqmI%3D","line":55,"updated":"2014-03-04 20:08:11.000000000","message":"I\u0027m still not sold on using make_app here. Using it just because it\u0027s used in other projects is not enough. But as you pointed out it\u0027s a minor issue.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        debug\u003dCONF.debug,"},{"line_number":58,"context_line":"        hooks\u003dapp_hooks,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fhvc%3D","line":55,"in_reply_to":"AAAAVn%2F%2FjpI%3D","updated":"2014-03-05 16:17:19.000000000","message":"Okay, thanks for all the pointers, greatly appreciated.\nWill remove all mentions to config.py, and will use load_app for loading setup_app() which itself loads make_app() as per the docstrings mentioned here https://github.com/stackforge/pecan/blob/master/pecan/__init__.py#L30\n\nDone","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":1531,"name":"Ilya Kharin","email":"akscram@gmail.com","username":"akscram"},"change_message_id":"a1fac152481dda0e57266be730979aeffee9e302","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    pecan.configuration.set_config(dict(pecan_config), overwrite\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    app \u003d pecan.make_app("},{"line_number":56,"context_line":"        pecan_config.app.root,"},{"line_number":57,"context_line":"        debug\u003dCONF.debug,"},{"line_number":58,"context_line":"        hooks\u003dapp_hooks,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FjpI%3D","line":55,"in_reply_to":"AAAAVn%2F%2FqmI%3D","updated":"2014-03-05 12:36:48.000000000","message":"The previous name of this method was better. I suggest that in vision of authors of the Pecan the module application should keep the setup_app methods to be able load it from configuration. Look at the load_app function (https://github.com/stackforge/pecan/blob/master/pecan/core.py#L145). The method sets up a runtime configuration and loads an application according to the app.modules config option. Therefore, there is no reason to set up the runtime configuration in your setup_app method. The setup_app function should to focus on preparing of the application such as add hooks, middlewares and etc. There is a simple workflow to load your app:\n\n    config \u003d {\n        \u0027app\u0027: {\n            \u0027modules\u0027: [\u0027path.to.package.with.app.module\u0027],\n        }\n    }\n    app \u003d pecan.load_app(config)\n\nAlso, according to the docstring of the make_app function (https://github.com/stackforge/pecan/blob/master/pecan/__init__.py#L30) it can be used in the application\u0027s setup_app function. Yes, as @Yuriy said there is no reason to call the make_app in your setup_app.\n\nI also wonder why other projects use it differently.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    if cfg.CONF.log_exchange:"},{"line_number":64,"context_line":"        app \u003d debug.Debug.factory(pecan_config)(app)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    pecan_config.app.enable_acl \u003d (CONF.auth_strategy \u003d\u003d \u0027keystone\u0027)"},{"line_number":67,"context_line":"    if pecan_config.app.enable_acl:"},{"line_number":68,"context_line":"        return acl.install(app, cfg.CONF)"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqoc%3D","line":66,"updated":"2014-03-04 20:08:11.000000000","message":"There\u0027s no need to store this value in pecan_config object since it is not used anywhere afterwards.\n\nAre we really going to support running Climate without Keystone? I can\u0027t imagine how can it work.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    if cfg.CONF.log_exchange:"},{"line_number":64,"context_line":"        app \u003d debug.Debug.factory(pecan_config)(app)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    pecan_config.app.enable_acl \u003d (CONF.auth_strategy \u003d\u003d \u0027keystone\u0027)"},{"line_number":67,"context_line":"    if pecan_config.app.enable_acl:"},{"line_number":68,"context_line":"        return acl.install(app, cfg.CONF)"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FicM%3D","line":66,"in_reply_to":"AAAAVn%2F%2Fqoc%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/api/v2/config.py":[{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"45b1b5b0690ec8d9921e5ff76c24ca1c4a6ecdd6","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \u0027modules\u0027: [\u0027climate.api.v2\u0027],"},{"line_number":23,"context_line":"    \u0027static_root\u0027: \u0027%(confdir)s/public\u0027,"},{"line_number":24,"context_line":"    \u0027template_path\u0027: \u0027%(confdir)s/climate/api/v2/templates\u0027,"},{"line_number":25,"context_line":"    \u0027debug\u0027: True,"},{"line_number":26,"context_line":"    \u0027enable_acl\u0027: True,"},{"line_number":27,"context_line":"}"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2FpNA%3D","line":25,"updated":"2014-02-11 20:36:39.000000000","message":"Maybe this should be False but default.","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b5b5e89e730d2223986187caef21accf6f046db5","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \u0027modules\u0027: [\u0027climate.api.v2\u0027],"},{"line_number":23,"context_line":"    \u0027static_root\u0027: \u0027%(confdir)s/public\u0027,"},{"line_number":24,"context_line":"    \u0027template_path\u0027: \u0027%(confdir)s/climate/api/v2/templates\u0027,"},{"line_number":25,"context_line":"    \u0027debug\u0027: True,"},{"line_number":26,"context_line":"    \u0027enable_acl\u0027: True,"},{"line_number":27,"context_line":"}"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Fiwg%3D","line":25,"in_reply_to":"AAAAUX%2F%2Fl7o%3D","updated":"2014-02-12 14:36:06.000000000","message":"Well, you\u0027re right, it should be set to debug\u003dTrue once the patch would arrive in trunk. Leaving it as it is, but putting a note in the commit msg for laking sure I won\u0027t forget.","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"f44e22ee036ef4bfc4f0a7ecbae11e7401567388","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \u0027modules\u0027: [\u0027climate.api.v2\u0027],"},{"line_number":23,"context_line":"    \u0027static_root\u0027: \u0027%(confdir)s/public\u0027,"},{"line_number":24,"context_line":"    \u0027template_path\u0027: \u0027%(confdir)s/climate/api/v2/templates\u0027,"},{"line_number":25,"context_line":"    \u0027debug\u0027: True,"},{"line_number":26,"context_line":"    \u0027enable_acl\u0027: True,"},{"line_number":27,"context_line":"}"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Fl7o%3D","line":25,"in_reply_to":"AAAAUX%2F%2FpNA%3D","updated":"2014-02-12 06:02:22.000000000","message":"Don\u0027t think so, cause otherwise your token won\u0027t be checked :)","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqwk%3D","line":1,"updated":"2014-03-04 20:08:11.000000000","message":"I can\u0027t stress this enough. This file is not needed and suggests configuring service through code changes. It\u0027s wrong. There should not be config.py-like files in the codebase. Everything can and should be configured within the code using one central config file through oslo.config.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FhVI%3D","line":1,"in_reply_to":"AAAAVn%2F%2Fqwk%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/api/v2/controllers/base.py":[{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"45b1b5b0690ec8d9921e5ff76c24ca1c4a6ecdd6","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    updated_at \u003d wtypes.text"},{"line_number":30,"context_line":"    \"The time in UTC at which the object is updated\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def as_dict(self, db_model):"},{"line_number":33,"context_line":"        valid_keys \u003d [item for item in dir(db_model)"},{"line_number":34,"context_line":"                      if item not in dir(_Base)"},{"line_number":35,"context_line":"                      and wtypes.iswsattr(getattr(db_model, item))]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2FpEU%3D","line":32,"updated":"2014-02-11 20:36:39.000000000","message":"I don\u0027t know if this is a \u0027standard\u0027 for WSME, but db_model is misleading for me. For me is better something like wsme_model or model. It\u0027s only a matter of taste, so you can ignore this comment.","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b5b5e89e730d2223986187caef21accf6f046db5","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    updated_at \u003d wtypes.text"},{"line_number":30,"context_line":"    \"The time in UTC at which the object is updated\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def as_dict(self, db_model):"},{"line_number":33,"context_line":"        valid_keys \u003d [item for item in dir(db_model)"},{"line_number":34,"context_line":"                      if item not in dir(_Base)"},{"line_number":35,"context_line":"                      and wtypes.iswsattr(getattr(db_model, item))]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Fiv8%3D","line":32,"in_reply_to":"AAAAUX%2F%2FpEU%3D","updated":"2014-02-12 14:36:06.000000000","message":"Done","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    \"The time in UTC at which the object is created\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    updated_at \u003d wtypes.text"},{"line_number":30,"context_line":"    \"The time in UTC at which the object is updated\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def as_dict(self, wsme_model):"},{"line_number":33,"context_line":"        valid_keys \u003d [item for item in dir(wsme_model)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWf8%3D","line":30,"updated":"2014-02-21 17:39:10.000000000","message":"Does this mean user will be able to specify created_at and updated_at?","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    \"The time in UTC at which the object is created\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    updated_at \u003d wtypes.text"},{"line_number":30,"context_line":"    \"The time in UTC at which the object is updated\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def as_dict(self, wsme_model):"},{"line_number":33,"context_line":"        valid_keys \u003d [item for item in dir(wsme_model)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F5V4%3D","line":30,"in_reply_to":"AAAAUX%2F%2BWf8%3D","updated":"2014-03-04 08:29:29.000000000","message":"Nope, that\u0027s only mean WSME will present these values","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    updated_at \u003d wtypes.text"},{"line_number":30,"context_line":"    \"The time in UTC at which the object is updated\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def as_dict(self, wsme_model):"},{"line_number":33,"context_line":"        valid_keys \u003d [item for item in dir(wsme_model)"},{"line_number":34,"context_line":"                      if item not in dir(_Base)"},{"line_number":35,"context_line":"                      and wtypes.iswsattr(getattr(wsme_model, item))]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWok%3D","line":32,"updated":"2014-02-21 17:39:10.000000000","message":"I think, you can use type(self) instead of wsme_model here.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    updated_at \u003d wtypes.text"},{"line_number":30,"context_line":"    \"The time in UTC at which the object is updated\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def as_dict(self, wsme_model):"},{"line_number":33,"context_line":"        valid_keys \u003d [item for item in dir(wsme_model)"},{"line_number":34,"context_line":"                      if item not in dir(_Base)"},{"line_number":35,"context_line":"                      and wtypes.iswsattr(getattr(wsme_model, item))]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F5Vo%3D","line":32,"in_reply_to":"AAAAUX%2F%2BWok%3D","updated":"2014-03-04 08:29:29.000000000","message":"nope, that\u0027s just a convention naming for saying we pass the model to be converted","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d62ba7a01c708de825c5ae795b62bc273673219b","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    updated_at \u003d wtypes.text"},{"line_number":30,"context_line":"    \"The time in UTC at which the object is updated\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def as_dict(self, wsme_model):"},{"line_number":33,"context_line":"        valid_keys \u003d [item for item in dir(wsme_model)"},{"line_number":34,"context_line":"                      if item not in dir(_Base)"},{"line_number":35,"context_line":"                      and wtypes.iswsattr(getattr(wsme_model, item))]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2Fwj4%3D","line":32,"in_reply_to":"AAAAVX%2F%2F5Vo%3D","updated":"2014-03-04 09:00:12.000000000","message":"It seems to be a very strange convention to me. Where is it defined? Would we ever pass wsme_model that isn\u0027t type(self)?","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c026fd3ff96c16b571eef53773671c3002ef687a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    updated_at \u003d wtypes.text"},{"line_number":30,"context_line":"    \"The time in UTC at which the object is updated\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def as_dict(self, wsme_model):"},{"line_number":33,"context_line":"        valid_keys \u003d [item for item in dir(wsme_model)"},{"line_number":34,"context_line":"                      if item not in dir(_Base)"},{"line_number":35,"context_line":"                      and wtypes.iswsattr(getattr(wsme_model, item))]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2FvGc%3D","line":32,"in_reply_to":"AAAAVn%2F%2Fwj4%3D","updated":"2014-03-04 17:15:49.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return dict((k, getattr(self, k))"},{"line_number":43,"context_line":"                    for k in keys"},{"line_number":44,"context_line":"                    if hasattr(self, k) and"},{"line_number":45,"context_line":"                    getattr(self, k) !\u003d wsme.Unset)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def convert(cls, rpc_obj):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWnM%3D","line":45,"updated":"2014-02-21 17:39:10.000000000","message":"You should probably expand this complex list comprehension like this:\n\n    res \u003d {}\n    for key in keys:\n        value \u003d getattr(self, k, wsme.Unset)\n        if value !\u003d wsme.Unset:\n            res[key] \u003d value\n    return res","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return dict((k, getattr(self, k))"},{"line_number":43,"context_line":"                    for k in keys"},{"line_number":44,"context_line":"                    if hasattr(self, k) and"},{"line_number":45,"context_line":"                    getattr(self, k) !\u003d wsme.Unset)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def convert(cls, rpc_obj):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F5Us%3D","line":45,"in_reply_to":"AAAAUX%2F%2BWnM%3D","updated":"2014-03-04 08:29:29.000000000","message":"That\u0027s only matter of choosing if we should have all in a one line or as you wrote.\nI personally prefer the way I wrote, but maybe you\u0027re seeing a drawback with it ?","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d62ba7a01c708de825c5ae795b62bc273673219b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return dict((k, getattr(self, k))"},{"line_number":43,"context_line":"                    for k in keys"},{"line_number":44,"context_line":"                    if hasattr(self, k) and"},{"line_number":45,"context_line":"                    getattr(self, k) !\u003d wsme.Unset)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def convert(cls, rpc_obj):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2Fwl0%3D","line":45,"in_reply_to":"AAAAVX%2F%2F5Us%3D","updated":"2014-03-04 09:00:12.000000000","message":"Plain loop is way simpler to comprehend then complex list comprehension. It doesn\u0027t even save you many lines of code since you have to write every part of it on separate line.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c026fd3ff96c16b571eef53773671c3002ef687a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return dict((k, getattr(self, k))"},{"line_number":43,"context_line":"                    for k in keys"},{"line_number":44,"context_line":"                    if hasattr(self, k) and"},{"line_number":45,"context_line":"                    getattr(self, k) !\u003d wsme.Unset)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def convert(cls, rpc_obj):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2FvFo%3D","line":45,"in_reply_to":"AAAAVn%2F%2Fwl0%3D","updated":"2014-03-04 17:15:49.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def as_dict(self):"},{"line_number":32,"context_line":"        valid_keys \u003d [item for item in dir(type(self))"},{"line_number":33,"context_line":"                      if item not in dir(_Base)"},{"line_number":34,"context_line":"                      and wtypes.iswsattr(getattr(type(self), item))]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        if \u0027self\u0027 in valid_keys:"},{"line_number":37,"context_line":"            valid_keys.remove(\u0027self\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqjY%3D","line":34,"updated":"2014-03-04 20:08:11.000000000","message":"You shouldn\u0027t calculate type(self) on every round. You can store it in local variable.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def as_dict(self):"},{"line_number":32,"context_line":"        valid_keys \u003d [item for item in dir(type(self))"},{"line_number":33,"context_line":"                      if item not in dir(_Base)"},{"line_number":34,"context_line":"                      and wtypes.iswsattr(getattr(type(self), item))]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        if \u0027self\u0027 in valid_keys:"},{"line_number":37,"context_line":"            valid_keys.remove(\u0027self\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FkUk%3D","line":34,"in_reply_to":"AAAAVn%2F%2FqjY%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/api/v2/controllers/host.py":[{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"89757641ded9b512b8a10f6021bb8a8147241e3c","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# FIXME(sbauza): Lazy dependency on oslo.messaging patch until it goes to trunk"},{"line_number":17,"context_line":"try:"},{"line_number":18,"context_line":"    from oslo import messaging"},{"line_number":19,"context_line":"except ImportError:"},{"line_number":20,"context_line":"    from climate.openstack.common.rpc import common as messaging"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FRZg%3D","line":18,"updated":"2014-02-14 10:40:53.000000000","message":"As we\u0027re using oslo.messaging second part is not needed anymore.","commit_id":"3ac96dfe5fb60214cc83ac71c1e2fa812540a98e"},{"author":{"_account_id":7132,"name":"Nikita Konovalov","email":"nkonovalov@mirantis.com","username":"nkonovalov"},"change_message_id":"2ade91d1df123cfe3b95a8eb84b6e41ad8311f3b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class Host(base._Base):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    id \u003d wtypes.text"},{"line_number":31,"context_line":"    \"The UUID of the host\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    hypervisor_hostname \u003d wtypes.text"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B53w%3D","line":30,"updated":"2014-02-18 09:52:08.000000000","message":"There is an UUIDType defined in types.py. Why is it not used here?\n\nThis applies to all id fields.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"73d458653ba788e8074da142e6614e6a70d3e320","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class Host(base._Base):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    id \u003d wtypes.text"},{"line_number":31,"context_line":"    \"The UUID of the host\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    hypervisor_hostname \u003d wtypes.text"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Biis%3D","line":30,"in_reply_to":"AAAAUX%2F%2B53w%3D","updated":"2014-02-24 08:38:05.000000000","message":"Unfortunately, the id is not from type uuid, but only an integer casted into string, so uuid raises a validation error","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7132,"name":"Nikita Konovalov","email":"nkonovalov@mirantis.com","username":"nkonovalov"},"change_message_id":"2ade91d1df123cfe3b95a8eb84b6e41ad8311f3b","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    # TODO(sbauza): Change type to json"},{"line_number":52,"context_line":"    cpu_info \u003d wtypes.text"},{"line_number":53,"context_line":"    \"The CPU info JSON data given by the hypervisor\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    # TODO(sbauza): Add extracapabilities support"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B52c%3D","line":53,"updated":"2014-02-18 09:52:08.000000000","message":"You may use wtypes.DictType or wtypes.ArrayType and their combinations to store jsons. Or even define another complex type (CpuInfo) and use it here.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"73d458653ba788e8074da142e6614e6a70d3e320","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    # TODO(sbauza): Change type to json"},{"line_number":52,"context_line":"    cpu_info \u003d wtypes.text"},{"line_number":53,"context_line":"    \"The CPU info JSON data given by the hypervisor\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    # TODO(sbauza): Add extracapabilities support"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BYhM%3D","line":53,"in_reply_to":"AAAAUX%2F%2B52c%3D","updated":"2014-02-24 08:38:05.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7132,"name":"Nikita Konovalov","email":"nkonovalov@mirantis.com","username":"nkonovalov"},"change_message_id":"2ade91d1df123cfe3b95a8eb84b6e41ad8311f3b","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        :param host: a host within the request body."},{"line_number":98,"context_line":"        \"\"\""},{"line_number":99,"context_line":"        with pecan.request.context:"},{"line_number":100,"context_line":"            policy.authorizer(\u0027oshosts\u0027, \u0027create\u0027)"},{"line_number":101,"context_line":"            # here API should go to Keystone API v3 and create trust"},{"line_number":102,"context_line":"            host_dct \u003d host.as_dict(Host)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B50k%3D","line":99,"updated":"2014-02-18 09:52:08.000000000","message":"Pecan hooks might be handy to call your policy.authorizer before the request is actually handled. So there will be no need to have a \u0027with\u0027 statement in each request.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"73d458653ba788e8074da142e6614e6a70d3e320","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        :param host: a host within the request body."},{"line_number":98,"context_line":"        \"\"\""},{"line_number":99,"context_line":"        with pecan.request.context:"},{"line_number":100,"context_line":"            policy.authorizer(\u0027oshosts\u0027, \u0027create\u0027)"},{"line_number":101,"context_line":"            # here API should go to Keystone API v3 and create trust"},{"line_number":102,"context_line":"            host_dct \u003d host.as_dict(Host)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAU3%2F%2F5J8%3D","line":99,"in_reply_to":"AAAAUX%2F%2B50k%3D","updated":"2014-02-24 08:38:05.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class Host(base._Base):"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    id \u003d wtypes.IntegerType()"},{"line_number":35,"context_line":"    \"The UUID of the host\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    hypervisor_hostname \u003d wtypes.text"},{"line_number":38,"context_line":"    \"The hostname of the host\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqiQ%3D","line":35,"updated":"2014-03-04 20:08:11.000000000","message":"Either comment or the type is wrong. Are we using integer IDs here?","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class Host(base._Base):"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    id \u003d wtypes.IntegerType()"},{"line_number":35,"context_line":"    \"The UUID of the host\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    hypervisor_hostname \u003d wtypes.text"},{"line_number":38,"context_line":"    \"The hostname of the host\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FkWc%3D","line":35,"in_reply_to":"AAAAVn%2F%2FqiQ%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    \"Extra capabilities for the host\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def __init__(self, **kwargs):"},{"line_number":66,"context_line":"        super(Host, self).__init__(**kwargs)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @classmethod"},{"line_number":69,"context_line":"    def convert(cls, rpc_obj):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqhc%3D","line":66,"updated":"2014-03-04 20:08:11.000000000","message":"Empty method should be removed.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    \"Extra capabilities for the host\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def __init__(self, **kwargs):"},{"line_number":66,"context_line":"        super(Host, self).__init__(**kwargs)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @classmethod"},{"line_number":69,"context_line":"    def convert(cls, rpc_obj):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FkWU%3D","line":66,"in_reply_to":"AAAAVn%2F%2Fqhc%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    @policy.authorize(\u0027oshosts\u0027, \u0027update\u0027)"},{"line_number":142,"context_line":"    @wsme_pecan.wsexpose(Host, wtypes.IntegerType(), body\u003dHost,"},{"line_number":143,"context_line":"                         status_code\u003d202)"},{"line_number":144,"context_line":"    def put(self, id, subhost):"},{"line_number":145,"context_line":"        \"\"\"Update an existing host."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        :param id: ID of a host."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqds%3D","line":144,"updated":"2014-03-04 20:08:11.000000000","message":"s/subhost/host/","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    @policy.authorize(\u0027oshosts\u0027, \u0027update\u0027)"},{"line_number":142,"context_line":"    @wsme_pecan.wsexpose(Host, wtypes.IntegerType(), body\u003dHost,"},{"line_number":143,"context_line":"                         status_code\u003d202)"},{"line_number":144,"context_line":"    def put(self, id, subhost):"},{"line_number":145,"context_line":"        \"\"\"Update an existing host."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        :param id: ID of a host."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FkWA%3D","line":144,"in_reply_to":"AAAAVn%2F%2Fqds%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/api/v2/controllers/lease.py":[{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"45b1b5b0690ec8d9921e5ff76c24ca1c4a6ecdd6","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            end_date \u003d sublease_dct.pop(\u0027end_date\u0027, None)"},{"line_number":114,"context_line":"            start_date \u003d sublease_dct.pop(\u0027start_date\u0027, None)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"            if sublease_dct \u003d\u003d {}:"},{"line_number":117,"context_line":"                raise exceptions.ClimateException(\u0027Only name changing and \u0027"},{"line_number":118,"context_line":"                                                  \u0027dates changing may be \u0027"},{"line_number":119,"context_line":"                                                  \u0027proceeded.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2FpA8%3D","line":116,"updated":"2014-02-11 20:36:39.000000000","message":"This should be \"if not sublease_dct:\"\nThe exception should be raise when sublease_dct is not empty.","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b5b5e89e730d2223986187caef21accf6f046db5","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            end_date \u003d sublease_dct.pop(\u0027end_date\u0027, None)"},{"line_number":114,"context_line":"            start_date \u003d sublease_dct.pop(\u0027start_date\u0027, None)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"            if sublease_dct \u003d\u003d {}:"},{"line_number":117,"context_line":"                raise exceptions.ClimateException(\u0027Only name changing and \u0027"},{"line_number":118,"context_line":"                                                  \u0027dates changing may be \u0027"},{"line_number":119,"context_line":"                                                  \u0027proceeded.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2FiqY%3D","line":116,"in_reply_to":"AAAAUX%2F%2FpA8%3D","updated":"2014-02-12 14:36:06.000000000","message":"Oops. The conditional should be !\u003d \n\nDone","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"45b1b5b0690ec8d9921e5ff76c24ca1c4a6ecdd6","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                raise exceptions.ClimateException(\u0027Only name changing and \u0027"},{"line_number":118,"context_line":"                                                  \u0027dates changing may be \u0027"},{"line_number":119,"context_line":"                                                  \u0027proceeded.\u0027)"},{"line_number":120,"context_line":"            sublease_dct \u003d {}"},{"line_number":121,"context_line":"            if new_name:"},{"line_number":122,"context_line":"                sublease_dct[\u0027name\u0027] \u003d new_name"},{"line_number":123,"context_line":"            if end_date:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Fo%2FQ%3D","line":120,"updated":"2014-02-11 20:36:39.000000000","message":"This could be removed because the previous comment.","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b5b5e89e730d2223986187caef21accf6f046db5","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                raise exceptions.ClimateException(\u0027Only name changing and \u0027"},{"line_number":118,"context_line":"                                                  \u0027dates changing may be \u0027"},{"line_number":119,"context_line":"                                                  \u0027proceeded.\u0027)"},{"line_number":120,"context_line":"            sublease_dct \u003d {}"},{"line_number":121,"context_line":"            if new_name:"},{"line_number":122,"context_line":"                sublease_dct[\u0027name\u0027] \u003d new_name"},{"line_number":123,"context_line":"            if end_date:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2FiqQ%3D","line":120,"in_reply_to":"AAAAUX%2F%2Fo%2FQ%3D","updated":"2014-02-12 14:36:06.000000000","message":"Done","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"89757641ded9b512b8a10f6021bb8a8147241e3c","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# FIXME(sbauza): Lazy dependency on oslo.messaging patch until it goes to trunk"},{"line_number":17,"context_line":"try:"},{"line_number":18,"context_line":"    from oslo import messaging"},{"line_number":19,"context_line":"except ImportError:"},{"line_number":20,"context_line":"    from climate.openstack.common.rpc import common as messaging"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FRZ4%3D","line":18,"updated":"2014-02-14 10:40:53.000000000","message":"As we are using oslo.messaging now, second part is not used anymore.","commit_id":"3ac96dfe5fb60214cc83ac71c1e2fa812540a98e"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        :param id: ID of lease"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        with pecan.request.context:"},{"line_number":91,"context_line":"            policy.authorizer(\u0027leases\u0027, \u0027get\u0027)"},{"line_number":92,"context_line":"            try:"},{"line_number":93,"context_line":"                lease \u003d pecan.request.rpcapi.get_lease(id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWl8%3D","line":90,"updated":"2014-02-21 17:39:10.000000000","message":"You don\u0027t need it with change to hooks.py I proposed.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        :param id: ID of lease"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        with pecan.request.context:"},{"line_number":91,"context_line":"            policy.authorizer(\u0027leases\u0027, \u0027get\u0027)"},{"line_number":92,"context_line":"            try:"},{"line_number":93,"context_line":"                lease \u003d pecan.request.rpcapi.get_lease(id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F5IE%3D","line":90,"in_reply_to":"AAAAUX%2F%2BWl8%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        :param id: ID of lease"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        with pecan.request.context:"},{"line_number":91,"context_line":"            policy.authorizer(\u0027leases\u0027, \u0027get\u0027)"},{"line_number":92,"context_line":"            try:"},{"line_number":93,"context_line":"                lease \u003d pecan.request.rpcapi.get_lease(id)"},{"line_number":94,"context_line":"            except messaging.RemoteError as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWl4%3D","line":91,"updated":"2014-02-21 17:39:10.000000000","message":"You should use old decorator instead.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        :param id: ID of lease"},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        with pecan.request.context:"},{"line_number":91,"context_line":"            policy.authorizer(\u0027leases\u0027, \u0027get\u0027)"},{"line_number":92,"context_line":"            try:"},{"line_number":93,"context_line":"                lease \u003d pecan.request.rpcapi.get_lease(id)"},{"line_number":94,"context_line":"            except messaging.RemoteError as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F5IA%3D","line":91,"in_reply_to":"AAAAUX%2F%2BWl4%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                base.rpcapi_exception(e)"},{"line_number":183,"context_line":"            except TypeError:"},{"line_number":184,"context_line":"                # The lease was not existing when asking to delete it"},{"line_number":185,"context_line":"                raise exceptions.NotFound(object\u003d{\u0027lease_id\u0027: id})"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWkk%3D","line":185,"updated":"2014-02-21 17:39:10.000000000","message":"This looks like a lot of boilerplate code. But I think, we can keep it for now.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                base.rpcapi_exception(e)"},{"line_number":183,"context_line":"            except TypeError:"},{"line_number":184,"context_line":"                # The lease was not existing when asking to delete it"},{"line_number":185,"context_line":"                raise exceptions.NotFound(object\u003d{\u0027lease_id\u0027: id})"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F5Hg%3D","line":185,"in_reply_to":"AAAAUX%2F%2BWkk%3D","updated":"2014-03-04 08:29:29.000000000","message":"What you mean about it ?\nWhat section is boilerplate ?","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d62ba7a01c708de825c5ae795b62bc273673219b","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                base.rpcapi_exception(e)"},{"line_number":183,"context_line":"            except TypeError:"},{"line_number":184,"context_line":"                # The lease was not existing when asking to delete it"},{"line_number":185,"context_line":"                raise exceptions.NotFound(object\u003d{\u0027lease_id\u0027: id})"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2Fwg4%3D","line":185,"in_reply_to":"AAAAVX%2F%2F5Hg%3D","updated":"2014-03-04 09:00:12.000000000","message":"Almost everything here looks like a boilerplate. We should have some base (meta)class that would wrap all methods (get_one, get_all, post, put, delete) with appropriate @wsexpose and @authorize decorators as well  as another decorator that would convert incoming arguments to dicts and results back to WSME models.\n\nBut it shouldn\u0027t be done in this change. It\u0027s just a good follow-up once we establish proper way of doing Pecan/WSME stuff.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from climate.api.v2.controllers import base"},{"line_number":23,"context_line":"from climate.api.v2.controllers import types"},{"line_number":24,"context_line":"from climate import exceptions"},{"line_number":25,"context_line":"from climate.manager.service import LEASE_DATE_FORMAT"},{"line_number":26,"context_line":"from climate.openstack.common.gettextutils import _  # noqa"},{"line_number":27,"context_line":"from climate import policy"},{"line_number":28,"context_line":"from climate.utils import trusts"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqcw%3D","line":25,"updated":"2014-03-04 20:08:11.000000000","message":"You are importing not module but an object here.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from climate.api.v2.controllers import base"},{"line_number":23,"context_line":"from climate.api.v2.controllers import types"},{"line_number":24,"context_line":"from climate import exceptions"},{"line_number":25,"context_line":"from climate.manager.service import LEASE_DATE_FORMAT"},{"line_number":26,"context_line":"from climate.openstack.common.gettextutils import _  # noqa"},{"line_number":27,"context_line":"from climate import policy"},{"line_number":28,"context_line":"from climate.utils import trusts"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FkYA%3D","line":25,"in_reply_to":"AAAAVn%2F%2Fqcw%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    \"The list of events attached to the lease\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self, **kwargs):"},{"line_number":61,"context_line":"        super(Lease, self).__init__(**kwargs)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @classmethod"},{"line_number":64,"context_line":"    def sample(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqb0%3D","line":61,"updated":"2014-03-04 20:08:11.000000000","message":"Noop method should be removed.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    \"The list of events attached to the lease\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self, **kwargs):"},{"line_number":61,"context_line":"        super(Lease, self).__init__(**kwargs)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @classmethod"},{"line_number":64,"context_line":"    def sample(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FkXw%3D","line":61,"in_reply_to":"AAAAVn%2F%2Fqb0%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/api/v2/controllers/root.py":[{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"45b1b5b0690ec8d9921e5ff76c24ca1c4a6ecdd6","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    v2 \u003d v2.V2Controller()"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    @pecan.expose(generic\u003dTrue, template\u003d\u0027index.html\u0027)"},{"line_number":26,"context_line":"    def index(self):"},{"line_number":27,"context_line":"        # FIXME: Return version information"},{"line_number":28,"context_line":"        return dict()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Fo9k%3D","line":25,"updated":"2014-02-11 20:36:39.000000000","message":"Is it ok use the html template here?","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b5b5e89e730d2223986187caef21accf6f046db5","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    v2 \u003d v2.V2Controller()"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    @pecan.expose(generic\u003dTrue, template\u003d\u0027index.html\u0027)"},{"line_number":26,"context_line":"    def index(self):"},{"line_number":27,"context_line":"        # FIXME: Return version information"},{"line_number":28,"context_line":"        return dict()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2FicU%3D","line":25,"in_reply_to":"AAAAUX%2F%2Fo9k%3D","updated":"2014-02-12 14:36:06.000000000","message":"I copied from Ceilometer","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"45b1b5b0690ec8d9921e5ff76c24ca1c4a6ecdd6","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    @pecan.expose(generic\u003dTrue, template\u003d\u0027index.html\u0027)"},{"line_number":26,"context_line":"    def index(self):"},{"line_number":27,"context_line":"        # FIXME: Return version information"},{"line_number":28,"context_line":"        return dict()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Fo6c%3D","line":27,"updated":"2014-02-11 20:36:39.000000000","message":"I don\u0027t know if Pecan gives a /versions url for free. If this is not the case I think we need to provide it. IIRC neutron, heat and glance support it.","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b5b5e89e730d2223986187caef21accf6f046db5","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    @pecan.expose(generic\u003dTrue, template\u003d\u0027index.html\u0027)"},{"line_number":26,"context_line":"    def index(self):"},{"line_number":27,"context_line":"        # FIXME: Return version information"},{"line_number":28,"context_line":"        return dict()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2FicE%3D","line":27,"in_reply_to":"AAAAUX%2F%2Fo6c%3D","updated":"2014-02-12 14:36:06.000000000","message":"I propose to do it on a separate patch, because it requires to implement a new Link controller.","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 Bull."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXf4%3D","line":1,"updated":"2014-02-21 17:39:10.000000000","message":"This module could probably be moved to the upper level. I think, climate.api.root is a better place for it since it\u0027s actually version-agnostic.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 Bull."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F5Sk%3D","line":1,"in_reply_to":"AAAAUX%2F%2BXf4%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"}],"climate/api/v2/controllers/types.py":[{"author":{"_account_id":7132,"name":"Nikita Konovalov","email":"nkonovalov@mirantis.com","username":"nkonovalov"},"change_message_id":"92a81512d298bcc67214e494712ca919a43832fd","unresolved":false,"context_lines":[{"line_number":61,"context_line":"uuid \u003d UuidType()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class MultiType(wtypes.UserType):"},{"line_number":65,"context_line":"    \"\"\"A complex type that represents one or more types."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    Used for validating that a value is an instance of one of the types."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2F3mY%3D","line":64,"updated":"2014-02-10 09:25:15.000000000","message":"This type is never used.","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b5b5e89e730d2223986187caef21accf6f046db5","unresolved":false,"context_lines":[{"line_number":61,"context_line":"uuid \u003d UuidType()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class MultiType(wtypes.UserType):"},{"line_number":65,"context_line":"    \"\"\"A complex type that represents one or more types."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    Used for validating that a value is an instance of one of the types."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Fib4%3D","line":64,"in_reply_to":"AAAAUX%2F%2F3mY%3D","updated":"2014-02-12 14:36:06.000000000","message":"Done","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @staticmethod"},{"line_number":41,"context_line":"    def validate(value):"},{"line_number":42,"context_line":"        try:"},{"line_number":43,"context_line":"            return six.text_type((uuid.UUID(value)))"},{"line_number":44,"context_line":"        except (TypeError, ValueError, AttributeError):"},{"line_number":45,"context_line":"            error \u003d \u0027Value should be UUID format\u0027"},{"line_number":46,"context_line":"            raise ValueError(error)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fqbc%3D","line":43,"updated":"2014-03-04 20:08:11.000000000","message":"Extra parenthesis here.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @staticmethod"},{"line_number":41,"context_line":"    def validate(value):"},{"line_number":42,"context_line":"        try:"},{"line_number":43,"context_line":"            return six.text_type((uuid.UUID(value)))"},{"line_number":44,"context_line":"        except (TypeError, ValueError, AttributeError):"},{"line_number":45,"context_line":"            error \u003d \u0027Value should be UUID format\u0027"},{"line_number":46,"context_line":"            raise ValueError(error)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fj%2BU%3D","line":43,"in_reply_to":"AAAAVn%2F%2Fqbc%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/api/v2/controllers/v2.py":[{"author":{"_account_id":7132,"name":"Nikita Konovalov","email":"nkonovalov@mirantis.com","username":"nkonovalov"},"change_message_id":"2ade91d1df123cfe3b95a8eb84b6e41ad8311f3b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    leases \u003d lease.LeasesController()"},{"line_number":31,"context_line":"    oshosts \u003d host.HostsController()"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @pecan.expose()"},{"line_number":34,"context_line":"    def _lookup(self, primary_key, *remainder):"},{"line_number":35,"context_line":"        if primary_key is not None and primary_key \u003d\u003d \u0027os-hosts\u0027:"},{"line_number":36,"context_line":"            return self.oshosts, remainder"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B5zg%3D","line":33,"updated":"2014-02-18 09:52:08.000000000","message":"Why do you expose this?","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"73d458653ba788e8074da142e6614e6a70d3e320","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    leases \u003d lease.LeasesController()"},{"line_number":31,"context_line":"    oshosts \u003d host.HostsController()"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @pecan.expose()"},{"line_number":34,"context_line":"    def _lookup(self, primary_key, *remainder):"},{"line_number":35,"context_line":"        if primary_key is not None and primary_key \u003d\u003d \u0027os-hosts\u0027:"},{"line_number":36,"context_line":"            return self.oshosts, remainder"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bkbg%3D","line":33,"in_reply_to":"AAAAUX%2F%2B5zg%3D","updated":"2014-02-24 08:38:05.000000000","message":"that\u0027s necessary as per http://pecan.readthedocs.org/en/latest/routing.html#routing-to-subcontrollers-with-lookup\n\nPlease note I\u0027ll change the routing using _route() method","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"f6ed59ad6209ad08411d0bbc2188a48b37c9c591","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    oshosts \u003d host.HostsController()"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @pecan.expose()"},{"line_number":34,"context_line":"    def _lookup(self, primary_key, *remainder):"},{"line_number":35,"context_line":"        if primary_key is not None and primary_key \u003d\u003d \u0027os-hosts\u0027:"},{"line_number":36,"context_line":"            return self.oshosts, remainder"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2FCbQ%3D","line":34,"updated":"2014-02-17 14:09:31.000000000","message":"This method provides access to the HostController using two URLs oshost and os-host. Maybe could be better to provide only one way to access to this controller.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"73d458653ba788e8074da142e6614e6a70d3e320","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    oshosts \u003d host.HostsController()"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @pecan.expose()"},{"line_number":34,"context_line":"    def _lookup(self, primary_key, *remainder):"},{"line_number":35,"context_line":"        if primary_key is not None and primary_key \u003d\u003d \u0027os-hosts\u0027:"},{"line_number":36,"context_line":"            return self.oshosts, remainder"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BkbQ%3D","line":34,"in_reply_to":"AAAAUX%2F%2FCbQ%3D","updated":"2014-02-24 08:38:05.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 Bull."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqX0%3D","line":1,"updated":"2014-03-04 20:08:11.000000000","message":"This module\u0027s name is misleading. It should be moved to __init__.py in controllers package.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 Bull."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fj88%3D","line":1,"in_reply_to":"AAAAVn%2F%2FqX0%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    #               the API"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    _routes \u003d {\u0027os-hosts\u0027: \u0027oshosts\u0027,"},{"line_number":36,"context_line":"               \u0027oshosts\u0027: \u0027None\u0027}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    leases \u003d lease.LeasesController()"},{"line_number":39,"context_line":"    oshosts \u003d host.HostsController()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqZc%3D","line":36,"updated":"2014-03-04 20:08:11.000000000","message":"This second value prohibits usage of /v2/oshosts/* path. Is it intentional?","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    #               the API"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    _routes \u003d {\u0027os-hosts\u0027: \u0027oshosts\u0027,"},{"line_number":36,"context_line":"               \u0027oshosts\u0027: \u0027None\u0027}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    leases \u003d lease.LeasesController()"},{"line_number":39,"context_line":"    oshosts \u003d host.HostsController()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fj98%3D","line":36,"in_reply_to":"AAAAVn%2F%2FqZc%3D","updated":"2014-03-05 16:17:19.000000000","message":"Yes, in the previous patchset, a comment from Nikita raised the point that we should only have one URL per controller, so I\u0027m routing \u0027os-hosts\u0027 to keep URL consistency with V1.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        try:"},{"line_number":50,"context_line":"            args[0] \u003d self._routes.get(args[0], None) or args[0]"},{"line_number":51,"context_line":"        except IndexError:"},{"line_number":52,"context_line":"            LOG.error(_(\"No args found on V2 controller\"))"},{"line_number":53,"context_line":"        return super(V2Controller, self)._route(args)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqYk%3D","line":50,"updated":"2014-03-04 20:08:11.000000000","message":"This should become\n\n    args[0] \u003d self._routes.get(args[0], args[0])","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        try:"},{"line_number":50,"context_line":"            args[0] \u003d self._routes.get(args[0], None) or args[0]"},{"line_number":51,"context_line":"        except IndexError:"},{"line_number":52,"context_line":"            LOG.error(_(\"No args found on V2 controller\"))"},{"line_number":53,"context_line":"        return super(V2Controller, self)._route(args)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fj9w%3D","line":50,"in_reply_to":"AAAAVn%2F%2FqYk%3D","updated":"2014-03-05 16:17:19.000000000","message":"Was probably tired when I wrote that stupid line. Thanks for the comment.\n\nDone","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/api/v2/hooks.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \"\"\"Configures a request context and attaches it to the request.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def before(self, state):"},{"line_number":45,"context_line":"        state.request.context \u003d context.ctx_from_headers(state.request.headers)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class RPCHook(hooks.PecanHook):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXkc%3D","line":45,"updated":"2014-02-21 17:39:10.000000000","message":"You should do\n\n    state.request.context.__enter__()\n\nhere and add after() and on_error() methods here\n\n    def after(self, state):\n        state.request.context.__exit__(None, None, None)\n\n    def on_error(self, state, exc):\n        state.request.context.__exit__(type(exc), exc, None)","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \"\"\"Configures a request context and attaches it to the request.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def before(self, state):"},{"line_number":45,"context_line":"        state.request.context \u003d context.ctx_from_headers(state.request.headers)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class RPCHook(hooks.PecanHook):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F5KA%3D","line":45,"in_reply_to":"AAAAUX%2F%2BXkc%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"}],"climate/api/v2/middleware/__init__.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"ParsableErrorMiddleware \u003d parsable_error.ParsableErrorMiddleware"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"__all__ \u003d (ParsableErrorMiddleware)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXOQ%3D","line":21,"updated":"2014-02-21 17:39:10.000000000","message":"This is a bit of a shift of the way we handle modules currently. If you really want to use this, you should put a list of strings to __all__, not the class itself. But I would suggest not putting it here and moving parsable_error to climate.api.v2.middleware by itself.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"ParsableErrorMiddleware \u003d parsable_error.ParsableErrorMiddleware"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"__all__ \u003d (ParsableErrorMiddleware)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F5Ic%3D","line":21,"in_reply_to":"AAAAUX%2F%2BXOQ%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                status_code \u003d int(status.split(\u0027 \u0027)[0])"},{"line_number":50,"context_line":"            except (ValueError, TypeError):  # pragma: nocover"},{"line_number":51,"context_line":"                raise Exception(_("},{"line_number":52,"context_line":"                    \u0027Status {0} was unexpected\u0027.format(status)))"},{"line_number":53,"context_line":"            else:"},{"line_number":54,"context_line":"                if status_code \u003e\u003d 400:"},{"line_number":55,"context_line":"                    # Remove some headers so we can replace them later"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqMs%3D","line":52,"updated":"2014-03-04 20:08:11.000000000","message":"This exception will fall out unparsable by itself. Some flag should be put to the status or some special exception should be raised here.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                status_code \u003d int(status.split(\u0027 \u0027)[0])"},{"line_number":50,"context_line":"            except (ValueError, TypeError):  # pragma: nocover"},{"line_number":51,"context_line":"                raise Exception(_("},{"line_number":52,"context_line":"                    \u0027Status {0} was unexpected\u0027.format(status)))"},{"line_number":53,"context_line":"            else:"},{"line_number":54,"context_line":"                if status_code \u003e\u003d 400:"},{"line_number":55,"context_line":"                    # Remove some headers so we can replace them later"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fi9I%3D","line":52,"in_reply_to":"AAAAVn%2F%2FqMs%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                               ]"},{"line_number":62,"context_line":"                # Save the headers as we need to modify them."},{"line_number":63,"context_line":"                state[\u0027status_code\u0027] \u003d status_code"},{"line_number":64,"context_line":"                state[\u0027headers\u0027] \u003d headers"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"                # NOTE(sbauza): We need to store the headers for resending them"},{"line_number":67,"context_line":"                #               later in the WSGI middleware app"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqUk%3D","line":64,"updated":"2014-03-04 20:08:11.000000000","message":"As I mentioned in the previous patchset, this should go into if: branch so that state dict is empty if we don\u0027t need to do anything.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                               ]"},{"line_number":62,"context_line":"                # Save the headers as we need to modify them."},{"line_number":63,"context_line":"                state[\u0027status_code\u0027] \u003d status_code"},{"line_number":64,"context_line":"                state[\u0027headers\u0027] \u003d headers"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"                # NOTE(sbauza): We need to store the headers for resending them"},{"line_number":67,"context_line":"                #               later in the WSGI middleware app"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FjDY%3D","line":64,"in_reply_to":"AAAAVn%2F%2FqUk%3D","updated":"2014-03-05 16:17:19.000000000","message":"Sorry, misunderstood what you were saying\n\nDone","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                # NOTE(sbauza): We need to store the headers for resending them"},{"line_number":67,"context_line":"                #               later in the WSGI middleware app"},{"line_number":68,"context_line":"                self.headers \u003d headers"},{"line_number":69,"context_line":"                self.exc_info \u003d exc_info"},{"line_number":70,"context_line":"                return start_response(status, headers, exc_info)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        app_iter \u003d self.app(environ, replacement_start_response)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqVU%3D","line":69,"updated":"2014-03-04 20:08:11.000000000","message":"You shouldn\u0027t store anything in self. It\u0027s reused for every call, so it\u0027s not thread-safe. You should store everything you need in state dict.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                # NOTE(sbauza): We need to store the headers for resending them"},{"line_number":67,"context_line":"                #               later in the WSGI middleware app"},{"line_number":68,"context_line":"                self.headers \u003d headers"},{"line_number":69,"context_line":"                self.exc_info \u003d exc_info"},{"line_number":70,"context_line":"                return start_response(status, headers, exc_info)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        app_iter \u003d self.app(environ, replacement_start_response)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FjDI%3D","line":69,"in_reply_to":"AAAAVn%2F%2FqVU%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                return start_response(status, headers, exc_info)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        app_iter \u003d self.app(environ, replacement_start_response)"},{"line_number":73,"context_line":"        if state is {} or state.get(\u0027status_code\u0027, 500) \u003c 400:"},{"line_number":74,"context_line":"            return app_iter"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # NOTE(sbauza): As agreed, XML is not supported with API v2, but can"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqT0%3D","line":73,"updated":"2014-03-04 20:08:11.000000000","message":"The first part will never pass since {} always generates brand-new dict. This should be shortened to:\n\n    if not state:","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                return start_response(status, headers, exc_info)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        app_iter \u003d self.app(environ, replacement_start_response)"},{"line_number":73,"context_line":"        if state is {} or state.get(\u0027status_code\u0027, 500) \u003c 400:"},{"line_number":74,"context_line":"            return app_iter"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # NOTE(sbauza): As agreed, XML is not supported with API v2, but can"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FjBc%3D","line":73,"in_reply_to":"AAAAVn%2F%2FqT0%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        traceback_marker \u003d \u0027Traceback (most recent call last):\u0027"},{"line_number":90,"context_line":"        remote_marker \u003d \u0027Remote error: \u0027"},{"line_number":91,"context_line":"        if faultstring:"},{"line_number":92,"context_line":"            if traceback_marker in faultstring:"},{"line_number":93,"context_line":"                # Cut-off traceback."},{"line_number":94,"context_line":"                faultstring \u003d faultstring.split(traceback_marker, 1)[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqPY%3D","line":91,"updated":"2014-03-04 20:08:11.000000000","message":"Put the short branch first and unindent the long one:\n\n    if not faultstring:\n        return app_iter\n\n    if traceback_marker ....","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        traceback_marker \u003d \u0027Traceback (most recent call last):\u0027"},{"line_number":90,"context_line":"        remote_marker \u003d \u0027Remote error: \u0027"},{"line_number":91,"context_line":"        if faultstring:"},{"line_number":92,"context_line":"            if traceback_marker in faultstring:"},{"line_number":93,"context_line":"                # Cut-off traceback."},{"line_number":94,"context_line":"                faultstring \u003d faultstring.split(traceback_marker, 1)[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fj38%3D","line":91,"in_reply_to":"AAAAVn%2F%2FqPY%3D","updated":"2014-03-05 16:17:19.000000000","message":"Done","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                        state[\u0027status_code\u0027] \u003d cls.code"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"            # NOTE(sbauza): Client expects a JSON encoded dict"},{"line_number":126,"context_line":"            body \u003d [json.dumps("},{"line_number":127,"context_line":"                    {\u0027error_code\u0027: state[\u0027status_code\u0027],"},{"line_number":128,"context_line":"                     \u0027error_message\u0027: faultstring,"},{"line_number":129,"context_line":"                     \u0027error_name\u0027: state[\u0027status_code\u0027]}"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqMU%3D","line":126,"updated":"2014-03-04 20:08:11.000000000","message":"There\u0027s no need for enclosing list here.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                        state[\u0027status_code\u0027] \u003d cls.code"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"            # NOTE(sbauza): Client expects a JSON encoded dict"},{"line_number":126,"context_line":"            body \u003d [json.dumps("},{"line_number":127,"context_line":"                    {\u0027error_code\u0027: state[\u0027status_code\u0027],"},{"line_number":128,"context_line":"                     \u0027error_message\u0027: faultstring,"},{"line_number":129,"context_line":"                     \u0027error_name\u0027: state[\u0027status_code\u0027]}"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fj3Y%3D","line":126,"in_reply_to":"AAAAVn%2F%2FqMU%3D","updated":"2014-03-05 16:17:19.000000000","message":"No, we need, WSGI spec requires an Iterable as response.\nI\u0027m extracting app_iter[0], I need to pass thru an Iterable back again.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            body \u003d [json.dumps("},{"line_number":127,"context_line":"                    {\u0027error_code\u0027: state[\u0027status_code\u0027],"},{"line_number":128,"context_line":"                     \u0027error_message\u0027: faultstring,"},{"line_number":129,"context_line":"                     \u0027error_name\u0027: state[\u0027status_code\u0027]}"},{"line_number":130,"context_line":"                    )]"},{"line_number":131,"context_line":"            start_response("},{"line_number":132,"context_line":"                webob.response.Response(status\u003dstate[\u0027status_code\u0027]).status,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqLw%3D","line":129,"updated":"2014-03-04 20:08:11.000000000","message":"Exception name should be stored here if it could be parsed out.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            body \u003d [json.dumps("},{"line_number":127,"context_line":"                    {\u0027error_code\u0027: state[\u0027status_code\u0027],"},{"line_number":128,"context_line":"                     \u0027error_message\u0027: faultstring,"},{"line_number":129,"context_line":"                     \u0027error_name\u0027: state[\u0027status_code\u0027]}"},{"line_number":130,"context_line":"                    )]"},{"line_number":131,"context_line":"            start_response("},{"line_number":132,"context_line":"                webob.response.Response(status\u003dstate[\u0027status_code\u0027]).status,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fi%2Fo%3D","line":129,"in_reply_to":"AAAAVn%2F%2FqLw%3D","updated":"2014-03-05 16:17:19.000000000","message":"that\u0027s not a requirement for API v1, and that\u0027s not necessary for API v2. Python client look at the status code for raising a standard HTTP exception with the correct message from the error_message","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7132,"name":"Nikita Konovalov","email":"nkonovalov@mirantis.com","username":"nkonovalov"},"change_message_id":"61bd4c5090d9922b82fa6c8dc16f0fea5ad1a62f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class ParsableErrorMiddleware(object):"},{"line_number":30,"context_line":"    \"\"\"Middleware to replace the plain text message body of an error"},{"line_number":31,"context_line":"    response with one formatted so the client can parse it."},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F%2BoAI%3D","line":29,"updated":"2014-03-25 13:53:03.000000000","message":"Is there any reason this class should be in a __init__.py file?","commit_id":"6f8e93963b42fb1a62433bc3dcb6b5470993dbe3"}],"climate/api/v2/middleware/parsable_error.py":[{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"45b1b5b0690ec8d9921e5ff76c24ca1c4a6ecdd6","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                state[\u0027status_code\u0027] \u003d status_code"},{"line_number":51,"context_line":"            except (ValueError, TypeError):  # pragma: nocover"},{"line_number":52,"context_line":"                raise Exception(_("},{"line_number":53,"context_line":"                    \u0027ErrorDocumentMiddleware received an invalid \u0027"},{"line_number":54,"context_line":"                    \u0027status %s\u0027) % status)"},{"line_number":55,"context_line":"            else:"},{"line_number":56,"context_line":"                if (state[\u0027status_code\u0027] // 100) not in (2, 3):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Fo34%3D","line":53,"updated":"2014-02-11 20:36:39.000000000","message":"I think here is ParsableErrorMiddleware","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b5b5e89e730d2223986187caef21accf6f046db5","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                state[\u0027status_code\u0027] \u003d status_code"},{"line_number":51,"context_line":"            except (ValueError, TypeError):  # pragma: nocover"},{"line_number":52,"context_line":"                raise Exception(_("},{"line_number":53,"context_line":"                    \u0027ErrorDocumentMiddleware received an invalid \u0027"},{"line_number":54,"context_line":"                    \u0027status %s\u0027) % status)"},{"line_number":55,"context_line":"            else:"},{"line_number":56,"context_line":"                if (state[\u0027status_code\u0027] // 100) not in (2, 3):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2FiXM%3D","line":53,"in_reply_to":"AAAAUX%2F%2Fo34%3D","updated":"2014-02-12 14:36:06.000000000","message":"Done","commit_id":"8a00aab5c912b146ea0b78c903145a16cf9f18df"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                status_code \u003d int(status.split(\u0027 \u0027)[0])"},{"line_number":50,"context_line":"                state[\u0027status_code\u0027] \u003d status_code"},{"line_number":51,"context_line":"            except (ValueError, TypeError):  # pragma: nocover"},{"line_number":52,"context_line":"                raise Exception(_("},{"line_number":53,"context_line":"                    \u0027ParsableErrorMiddleware received an invalid \u0027"},{"line_number":54,"context_line":"                    \u0027status %s\u0027) % status)"},{"line_number":55,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXMs%3D","line":52,"updated":"2014-02-21 17:39:10.000000000","message":"This exception will end up as unparsable by itself. It should put some info to state saying that there was unexpected status.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                status_code \u003d int(status.split(\u0027 \u0027)[0])"},{"line_number":50,"context_line":"                state[\u0027status_code\u0027] \u003d status_code"},{"line_number":51,"context_line":"            except (ValueError, TypeError):  # pragma: nocover"},{"line_number":52,"context_line":"                raise Exception(_("},{"line_number":53,"context_line":"                    \u0027ParsableErrorMiddleware received an invalid \u0027"},{"line_number":54,"context_line":"                    \u0027status %s\u0027) % status)"},{"line_number":55,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F8bM%3D","line":52,"in_reply_to":"AAAAUX%2F%2BXMs%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                    \u0027ParsableErrorMiddleware received an invalid \u0027"},{"line_number":54,"context_line":"                    \u0027status %s\u0027) % status)"},{"line_number":55,"context_line":"            else:"},{"line_number":56,"context_line":"                if (state[\u0027status_code\u0027] // 100) not in (2, 3):"},{"line_number":57,"context_line":"                    # Remove some headers so we can replace them later"},{"line_number":58,"context_line":"                    # when we have the full error message and can"},{"line_number":59,"context_line":"                    # compute the length."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BW7Q%3D","line":56,"updated":"2014-02-21 17:39:10.000000000","message":"You should not intercept 1xx errors here. I think you can safely use\n\n    if status_code \u003e\u003d 400:\n\nhere.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                    \u0027ParsableErrorMiddleware received an invalid \u0027"},{"line_number":54,"context_line":"                    \u0027status %s\u0027) % status)"},{"line_number":55,"context_line":"            else:"},{"line_number":56,"context_line":"                if (state[\u0027status_code\u0027] // 100) not in (2, 3):"},{"line_number":57,"context_line":"                    # Remove some headers so we can replace them later"},{"line_number":58,"context_line":"                    # when we have the full error message and can"},{"line_number":59,"context_line":"                    # compute the length."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F8ag%3D","line":56,"in_reply_to":"AAAAUX%2F%2BW7Q%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    # compute the length."},{"line_number":60,"context_line":"                    headers \u003d [(h, v)"},{"line_number":61,"context_line":"                               for (h, v) in headers"},{"line_number":62,"context_line":"                               if h not in (\u0027Content-Length\u0027)"},{"line_number":63,"context_line":"                               ]"},{"line_number":64,"context_line":"                # Save the headers in case we need to modify them."},{"line_number":65,"context_line":"                state[\u0027headers\u0027] \u003d headers"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXME%3D","line":62,"updated":"2014-02-21 17:39:10.000000000","message":"You\u0027re checking for all substrings of \u0027Content-Length\u0027 here. You use something like:\n\n    if h.lower() !\u003d \u0027content-length\u0027\n\nhere. HTTP headers are case-insensitive.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                    # compute the length."},{"line_number":60,"context_line":"                    headers \u003d [(h, v)"},{"line_number":61,"context_line":"                               for (h, v) in headers"},{"line_number":62,"context_line":"                               if h not in (\u0027Content-Length\u0027)"},{"line_number":63,"context_line":"                               ]"},{"line_number":64,"context_line":"                # Save the headers in case we need to modify them."},{"line_number":65,"context_line":"                state[\u0027headers\u0027] \u003d headers"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F8Z4%3D","line":62,"in_reply_to":"AAAAUX%2F%2BXME%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                               if h not in (\u0027Content-Length\u0027)"},{"line_number":63,"context_line":"                               ]"},{"line_number":64,"context_line":"                # Save the headers in case we need to modify them."},{"line_number":65,"context_line":"                state[\u0027headers\u0027] \u003d headers"},{"line_number":66,"context_line":"                return start_response(status, headers, exc_info)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        app_iter \u003d self.app(environ, replacement_start_response)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BW6E%3D","line":65,"updated":"2014-02-21 17:39:10.000000000","message":"How about not putting anything to state unless we need to do smth about it so that we won\u0027t need to repeat status_code check.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                               if h not in (\u0027Content-Length\u0027)"},{"line_number":63,"context_line":"                               ]"},{"line_number":64,"context_line":"                # Save the headers in case we need to modify them."},{"line_number":65,"context_line":"                state[\u0027headers\u0027] \u003d headers"},{"line_number":66,"context_line":"                return start_response(status, headers, exc_info)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        app_iter \u003d self.app(environ, replacement_start_response)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F8Us%3D","line":65,"in_reply_to":"AAAAUX%2F%2BW6E%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                return start_response(status, headers, exc_info)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        app_iter \u003d self.app(environ, replacement_start_response)"},{"line_number":69,"context_line":"        if (state[\u0027status_code\u0027] // 100) not in (2, 3):"},{"line_number":70,"context_line":"            req \u003d webob.Request(environ)"},{"line_number":71,"context_line":"            if (req.accept.best_match([\u0027application/json\u0027, \u0027application/xml\u0027])"},{"line_number":72,"context_line":"                    \u003d\u003d \u0027application/xml\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BW4k%3D","line":69,"updated":"2014-02-21 17:39:10.000000000","message":"Please take care of short fatal branch first and keep the long one for later. This will reduce indent of following code:\n\n    if not state:  # see previous comment\n        return app_iter\n\n    req \u003d webob.Request(environ)\n    ....","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                return start_response(status, headers, exc_info)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        app_iter \u003d self.app(environ, replacement_start_response)"},{"line_number":69,"context_line":"        if (state[\u0027status_code\u0027] // 100) not in (2, 3):"},{"line_number":70,"context_line":"            req \u003d webob.Request(environ)"},{"line_number":71,"context_line":"            if (req.accept.best_match([\u0027application/json\u0027, \u0027application/xml\u0027])"},{"line_number":72,"context_line":"                    \u003d\u003d \u0027application/xml\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F8Uo%3D","line":69,"in_reply_to":"AAAAUX%2F%2BW4k%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        if (state[\u0027status_code\u0027] // 100) not in (2, 3):"},{"line_number":70,"context_line":"            req \u003d webob.Request(environ)"},{"line_number":71,"context_line":"            if (req.accept.best_match([\u0027application/json\u0027, \u0027application/xml\u0027])"},{"line_number":72,"context_line":"                    \u003d\u003d \u0027application/xml\u0027):"},{"line_number":73,"context_line":"                try:"},{"line_number":74,"context_line":"                    # simple check xml is valid"},{"line_number":75,"context_line":"                    body \u003d [et.ElementTree.tostring("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BW3M%3D","line":72,"updated":"2014-02-21 17:39:10.000000000","message":"Do we really support XML? I think, this should just be cut out. And webob is not needed at all then btw.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        if (state[\u0027status_code\u0027] // 100) not in (2, 3):"},{"line_number":70,"context_line":"            req \u003d webob.Request(environ)"},{"line_number":71,"context_line":"            if (req.accept.best_match([\u0027application/json\u0027, \u0027application/xml\u0027])"},{"line_number":72,"context_line":"                    \u003d\u003d \u0027application/xml\u0027):"},{"line_number":73,"context_line":"                try:"},{"line_number":74,"context_line":"                    # simple check xml is valid"},{"line_number":75,"context_line":"                    body \u003d [et.ElementTree.tostring("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F5XQ%3D","line":72,"in_reply_to":"AAAAUX%2F%2BW3M%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                try:"},{"line_number":86,"context_line":"                    res_dct \u003d json.loads(app_iter[0])"},{"line_number":87,"context_line":"                except ValueError:"},{"line_number":88,"context_line":"                    body \u003d app_iter"},{"line_number":89,"context_line":"                else:"},{"line_number":90,"context_line":"                    faultstring \u003d res_dct.get(\u0027faultstring\u0027)"},{"line_number":91,"context_line":"                traceback_marker \u003d \u0027[u\\\u0027Traceback (most recent call last):\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BW10%3D","line":88,"updated":"2014-02-21 17:39:10.000000000","message":"You should do\n\n    return app_iter\n\nhere as your code will fail on line 93 with NameError otherwise since you won\u0027t have faultstring defined.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                try:"},{"line_number":86,"context_line":"                    res_dct \u003d json.loads(app_iter[0])"},{"line_number":87,"context_line":"                except ValueError:"},{"line_number":88,"context_line":"                    body \u003d app_iter"},{"line_number":89,"context_line":"                else:"},{"line_number":90,"context_line":"                    faultstring \u003d res_dct.get(\u0027faultstring\u0027)"},{"line_number":91,"context_line":"                traceback_marker \u003d \u0027[u\\\u0027Traceback (most recent call last):\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F7%2Bo%3D","line":88,"in_reply_to":"AAAAUX%2F%2BW10%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                except ValueError:"},{"line_number":88,"context_line":"                    body \u003d app_iter"},{"line_number":89,"context_line":"                else:"},{"line_number":90,"context_line":"                    faultstring \u003d res_dct.get(\u0027faultstring\u0027)"},{"line_number":91,"context_line":"                traceback_marker \u003d \u0027[u\\\u0027Traceback (most recent call last):\u0027"},{"line_number":92,"context_line":"                remote_marker \u003d \u0027Remote error: \u0027"},{"line_number":93,"context_line":"                if faultstring:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BW04%3D","line":90,"updated":"2014-02-21 17:39:10.000000000","message":"You should do\n\n    try:\n        faultstring \u003d res_dct[\u0027faultstring\u0027]\n    except KeyError:\n        return app_iter\n\ninstead this and following if.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                except ValueError:"},{"line_number":88,"context_line":"                    body \u003d app_iter"},{"line_number":89,"context_line":"                else:"},{"line_number":90,"context_line":"                    faultstring \u003d res_dct.get(\u0027faultstring\u0027)"},{"line_number":91,"context_line":"                traceback_marker \u003d \u0027[u\\\u0027Traceback (most recent call last):\u0027"},{"line_number":92,"context_line":"                remote_marker \u003d \u0027Remote error: \u0027"},{"line_number":93,"context_line":"                if faultstring:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F7%2BA%3D","line":90,"in_reply_to":"AAAAUX%2F%2BW04%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                            )]"},{"line_number":112,"context_line":"                else:"},{"line_number":113,"context_line":"                    body \u003d app_iter"},{"line_number":114,"context_line":"            state[\u0027headers\u0027].append((\u0027Content-Length\u0027, len(body[0])))"},{"line_number":115,"context_line":"        else:"},{"line_number":116,"context_line":"            body \u003d app_iter"},{"line_number":117,"context_line":"        return body"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWz8%3D","line":114,"updated":"2014-02-21 17:39:10.000000000","message":"I don\u0027t see any uses for state[\u0027headers\u0027] here... start_response is already gone, so we won\u0027t change anything with this line.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                            )]"},{"line_number":112,"context_line":"                else:"},{"line_number":113,"context_line":"                    body \u003d app_iter"},{"line_number":114,"context_line":"            state[\u0027headers\u0027].append((\u0027Content-Length\u0027, len(body[0])))"},{"line_number":115,"context_line":"        else:"},{"line_number":116,"context_line":"            body \u003d app_iter"},{"line_number":117,"context_line":"        return body"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2F8DQ%3D","line":114,"in_reply_to":"AAAAUX%2F%2BWz8%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"}],"climate/cmd/api.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":36,"context_line":"]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"auth_opts \u003d ["},{"line_number":39,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027,"},{"line_number":40,"context_line":"                default\u003dTrue,"},{"line_number":41,"context_line":"                help\u003d\u0027Deploy the deprecated v1 API.\u0027),"},{"line_number":42,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXgk%3D","line":39,"updated":"2014-02-21 17:39:10.000000000","message":"How it this an \"auth\" option? Why is it needed? I don\u0027t see any harm in attaching v1 API along with v2 as long as the server\u0027s going to support it.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":36,"context_line":"]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"auth_opts \u003d ["},{"line_number":39,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027,"},{"line_number":40,"context_line":"                default\u003dTrue,"},{"line_number":41,"context_line":"                help\u003d\u0027Deploy the deprecated v1 API.\u0027),"},{"line_number":42,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2Fxi4%3D","line":39,"in_reply_to":"AAAAUX%2F%2BXgk%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if cfg.CONF.enable_v1_api:"},{"line_number":54,"context_line":"            self.v1 \u003d v1_app.make_app()"},{"line_number":55,"context_line":"        else:"},{"line_number":56,"context_line":"            def not_found(environ, start_response):"},{"line_number":57,"context_line":"                start_response(\u0027404 Not Found\u0027, [])"},{"line_number":58,"context_line":"                return []"},{"line_number":59,"context_line":"            self.v1 \u003d not_found"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BXTQ%3D","line":56,"updated":"2014-02-21 17:39:10.000000000","message":"There\u0027s no need to define this method here. You should move it to global space.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if cfg.CONF.enable_v1_api:"},{"line_number":54,"context_line":"            self.v1 \u003d v1_app.make_app()"},{"line_number":55,"context_line":"        else:"},{"line_number":56,"context_line":"            def not_found(environ, start_response):"},{"line_number":57,"context_line":"                start_response(\u0027404 Not Found\u0027, [])"},{"line_number":58,"context_line":"                return []"},{"line_number":59,"context_line":"            self.v1 \u003d not_found"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2Fwvc%3D","line":56,"in_reply_to":"AAAAUX%2F%2BXTQ%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"ba4049bf2fb0374382afe07cf2de18cfc22a93df","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            self.v1 \u003d v1_app.make_app()"},{"line_number":55,"context_line":"        else:"},{"line_number":56,"context_line":"            def not_found(environ, start_response):"},{"line_number":57,"context_line":"                start_response(\u0027404 Not Found\u0027, [])"},{"line_number":58,"context_line":"                return []"},{"line_number":59,"context_line":"            self.v1 \u003d not_found"},{"line_number":60,"context_line":"        self.v2 \u003d v2_app.make_app()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2FCJ8%3D","line":57,"updated":"2014-02-17 14:45:37.000000000","message":"Maybe could be useful return a message that lets to the user know that the thing that was was not found is the version, not the resource that he/she wants.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"73d458653ba788e8074da142e6614e6a70d3e320","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            self.v1 \u003d v1_app.make_app()"},{"line_number":55,"context_line":"        else:"},{"line_number":56,"context_line":"            def not_found(environ, start_response):"},{"line_number":57,"context_line":"                start_response(\u0027404 Not Found\u0027, [])"},{"line_number":58,"context_line":"                return []"},{"line_number":59,"context_line":"            self.v1 \u003d not_found"},{"line_number":60,"context_line":"        self.v2 \u003d v2_app.make_app()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BilY%3D","line":57,"in_reply_to":"AAAAUX%2F%2FCJ8%3D","updated":"2014-02-24 08:38:05.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    config.parse_configs(sys.argv[1:], config_files)"},{"line_number":81,"context_line":"    service_utils.prepare_service(sys.argv)"},{"line_number":82,"context_line":"    logging.setup(\"climate\")"},{"line_number":83,"context_line":"    app \u003d VersionSelectorApplication()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    wsgi.server(eventlet.listen((CONF.host, CONF.port), backlog\u003d500), app)"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BW%2Fg%3D","line":83,"updated":"2014-02-21 17:39:10.000000000","message":"I guess you can replace it with this:\n\n    if not CONF.enable_v1_api:\n        app \u003d v2_app.make_app()\n    else:\n        v1 \u003d v1_app.make_app()\n        v2 \u003d v2_app.make_app()\n        def app(environ, start_response):\n            if environ[\u0027PATH_INFO\u0027].startswith(\u0027/v1/\u0027):\n                return v1(environ, start_response)\n            else:\n                return v2(environ, start_response)\n\nThis should be nicer than creating another class for couple lines of code. Btw, you won\u0027t need to generate 404 error by yourself.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    config.parse_configs(sys.argv[1:], config_files)"},{"line_number":81,"context_line":"    service_utils.prepare_service(sys.argv)"},{"line_number":82,"context_line":"    logging.setup(\"climate\")"},{"line_number":83,"context_line":"    app \u003d VersionSelectorApplication()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    wsgi.server(eventlet.listen((CONF.host, CONF.port), backlog\u003d500), app)"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2Fwvg%3D","line":83,"in_reply_to":"AAAAUX%2F%2BW%2Fg%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d3e2344fa7dd140b3089dc19392d3fc8c1e45b41","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    cfg.CONF(sys.argv[1:], project\u003d\u0027climate\u0027, prog\u003d\u0027climate-api\u0027)"},{"line_number":70,"context_line":"    service_utils.prepare_service(sys.argv)"},{"line_number":71,"context_line":"    logging.setup(\"climate\")"},{"line_number":72,"context_line":"    app \u003d VersionSelectorApplication()"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    wsgi.server(eventlet.listen((CONF.host, CONF.port), backlog\u003d500), app)"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FqJ0%3D","line":72,"updated":"2014-03-04 20:08:11.000000000","message":"Please see my suggestion in the previous patchset. I think we should determine if we need APIv1 here and use smth like VersionSelector only if it\u0027s needed.","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cbbd25b0dbc86330bb7f1ed31c4b9fa3d9a1ca86","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    cfg.CONF(sys.argv[1:], project\u003d\u0027climate\u0027, prog\u003d\u0027climate-api\u0027)"},{"line_number":70,"context_line":"    service_utils.prepare_service(sys.argv)"},{"line_number":71,"context_line":"    logging.setup(\"climate\")"},{"line_number":72,"context_line":"    app \u003d VersionSelectorApplication()"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    wsgi.server(eventlet.listen((CONF.host, CONF.port), backlog\u003d500), app)"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FiSo%3D","line":72,"in_reply_to":"AAAAVn%2F%2FqJ0%3D","updated":"2014-03-05 16:17:19.000000000","message":"Sorry for the misunderstanding,\n\nDone","commit_id":"2e1cab0150ecde953afc309c53b836fdeb528add"}],"climate/policy.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a2dc4766a740092d8e02f30b5a7abad601f85405","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        return wrapped"},{"line_number":104,"context_line":"    return decorator"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def authorizer(extension, action\u003dNone, api\u003d\u0027climate\u0027, ctx\u003dNone,"},{"line_number":108,"context_line":"               target\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BWqE%3D","line":105,"updated":"2014-02-21 17:39:10.000000000","message":"This change seems unrelated to me. You can use the old wrapper with new methods.","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fa6814d69f17b4d2540a7f2f8fad2d4b13bc775","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        return wrapped"},{"line_number":104,"context_line":"    return decorator"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def authorizer(extension, action\u003dNone, api\u003d\u0027climate\u0027, ctx\u003dNone,"},{"line_number":108,"context_line":"               target\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F7BI%3D","line":105,"in_reply_to":"AAAAUX%2F%2BWqE%3D","updated":"2014-03-04 08:29:29.000000000","message":"Done","commit_id":"a47cd2ee0da16bd669b826f5c07de36853969be4"}],"climate/tests/api/utils.py":[{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"3ee99e05c1641747a4b2fe98c2c4f85d4f915eba","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                         \u0027name\u0027: \u0027user-good\u0027,"},{"line_number":45,"context_line":"                         \u0027tenantId\u0027: \u0027project-good\u0027,"},{"line_number":46,"context_line":"                         \u0027tenantName\u0027: \u0027goodies\u0027,"},{"line_number":47,"context_line":"                         \u0027roles\u0027: [{\u0027name\u0027: \u0027Member\u0027}]},"},{"line_number":48,"context_line":"            }"},{"line_number":49,"context_line":"        }"},{"line_number":50,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAWH%2F%2F0wc%3D","line":47,"updated":"2014-03-13 15:20:09.000000000","message":"Member should be in lowercase? I\u0027m asking because I noticed that you are assigning the role member using lowecase in climate/tests/api/__init__.py. I don\u0027t know much about roles, so I\u0027m not sure if this is an issue or not","commit_id":"d7e5bc69c74ea76585f4899bb861cc0a8d3c119e"}],"doc/source/conf.py":[{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"0726281f1d4cc2fb52a20a7bbc3bd46edb69090a","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"# General information about the project."},{"line_number":55,"context_line":"project \u003d u\u0027Climate\u0027"},{"line_number":56,"context_line":"copyright \u003d u\u00272013, Mirantis Inc.;2014, Bull.\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# The version info for the project you\u0027re documenting, acts as replacement for"},{"line_number":59,"context_line":"# |version| and |release|, also used in various other places throughout the"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAVn%2F%2B%2FoM%3D","line":56,"updated":"2014-03-10 20:18:12.000000000","message":"Based on our level of contributions, do you think Intel should also be in the Copyrights?","commit_id":"81563d09517b9ac87c9ac32dde29081018bbb316"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"93e3db3ca836880365748d8f3ef06f65f2b05b61","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"# General information about the project."},{"line_number":55,"context_line":"project \u003d u\u0027Climate\u0027"},{"line_number":56,"context_line":"copyright \u003d u\u00272013, Mirantis Inc.;2014, Bull.\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# The version info for the project you\u0027re documenting, acts as replacement for"},{"line_number":59,"context_line":"# |version| and |release|, also used in various other places throughout the"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAVn%2F%2B7Y4%3D","line":56,"in_reply_to":"AAAAVn%2F%2B%2FoM%3D","updated":"2014-03-11 08:23:45.000000000","message":"Copyrighting in headers is only targeted if some major changes happened. \nUsually I don\u0027t modify headers as frankly speaking I don\u0027t care, but in this case, as I\u0027m autogenerating API doc using Sphinx, I was thinking it\u0027s worth adding Bull in it.\n\nGit blame is definitely my source of truth, so if you feel uncomfortable with it, I can remove this add.","commit_id":"81563d09517b9ac87c9ac32dde29081018bbb316"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"36087191fee57df1c774c1cf7e42daa6ebf7da77","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"# General information about the project."},{"line_number":55,"context_line":"project \u003d u\u0027Climate\u0027"},{"line_number":56,"context_line":"copyright \u003d u\u00272013, Mirantis Inc.;2014, Bull.\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# The version info for the project you\u0027re documenting, acts as replacement for"},{"line_number":59,"context_line":"# |version| and |release|, also used in various other places throughout the"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAVn%2F%2B3xg%3D","line":56,"in_reply_to":"AAAAVn%2F%2B7Y4%3D","updated":"2014-03-11 16:06:14.000000000","message":"I don\u0027t feel uncomfortable about this. I was just asking because I didn\u0027t know how this was handled.","commit_id":"81563d09517b9ac87c9ac32dde29081018bbb316"}]}
