)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a02fb6d6cee8cd04fd2ebbce2a2c1b1bc289c292","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Decorator @policy.authorize allows enforcing policy checks on"},{"line_number":16,"context_line":"controllers."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Toileted also Exceptions"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"TODO :"},{"line_number":21,"context_line":" - Add get_admin_roles method for elevated() context method"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAATn%2F%2BgZU%3D","line":18,"updated":"2013-11-25 11:40:06.000000000","message":"Interesting wording :)","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Decorator @policy.authorize allows enforcing policy checks on"},{"line_number":16,"context_line":"controllers."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Toileted also Exceptions"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"TODO :"},{"line_number":21,"context_line":" - Add get_admin_roles method for elevated() context method"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAATn%2F%2Bfvo%3D","line":18,"in_reply_to":"AAAATn%2F%2BgZU%3D","updated":"2013-11-25 14:09:50.000000000","message":"Oops :-)","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a02fb6d6cee8cd04fd2ebbce2a2c1b1bc289c292","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Toileted also Exceptions"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"TODO :"},{"line_number":21,"context_line":" - Add get_admin_roles method for elevated() context method"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Implements bp:climate-policy"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAATn%2F%2BgY8%3D","line":21,"updated":"2013-11-25 11:40:06.000000000","message":"This should not be needed as long as we use is_admin to elevate contexts.","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Toileted also Exceptions"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"TODO :"},{"line_number":21,"context_line":" - Add get_admin_roles method for elevated() context method"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Implements bp:climate-policy"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAATn%2F%2BfvI%3D","line":21,"in_reply_to":"AAAATn%2F%2BgY8%3D","updated":"2013-11-25 14:09:50.000000000","message":"let\u0027s discuss that by IRC","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"}],"climate/api/service.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2d43c8e72710ad200d97f72af78fb2bed500c109","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    ## Leases operations"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @policy.authorize(\u0027leases\u0027)"},{"line_number":33,"context_line":"    def get_leases(self):"},{"line_number":34,"context_line":"        \"\"\"List all existing leases.\"\"\""},{"line_number":35,"context_line":"        return self.manager_rpcapi.list_leases()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Bgh8%3D","line":32,"updated":"2013-11-25 11:03:02.000000000","message":"There should be per-action rules in policy like \"leases:get\".","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    ## Leases operations"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @policy.authorize(\u0027leases\u0027)"},{"line_number":33,"context_line":"    def get_leases(self):"},{"line_number":34,"context_line":"        \"\"\"List all existing leases.\"\"\""},{"line_number":35,"context_line":"        return self.manager_rpcapi.list_leases()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Bfus%3D","line":32,"in_reply_to":"AAAATn%2F%2Bgh8%3D","updated":"2013-11-25 14:09:50.000000000","message":"Done","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"449d13da2ef047f5ce025f639261235d3e3b260e","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    ## Plugins operations"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @policy.authorize(extension\u003d\u0027plugins\u0027)"},{"line_number":96,"context_line":"    def get_plugins(self):"},{"line_number":97,"context_line":"        \"\"\"List all possible plugins.\"\"\""},{"line_number":98,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BQOM%3D","line":95,"updated":"2013-11-28 10:01:45.000000000","message":"This should also have action \u0027get\u0027.","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0665ea32ab83b85a05af193cc89ac88ab39591ea","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    ## Plugins operations"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @policy.authorize(extension\u003d\u0027plugins\u0027)"},{"line_number":96,"context_line":"    def get_plugins(self):"},{"line_number":97,"context_line":"        \"\"\"List all possible plugins.\"\"\""},{"line_number":98,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BP%2Fs%3D","line":95,"in_reply_to":"AAAATn%2F%2BQOM%3D","updated":"2013-11-28 11:39:16.000000000","message":"Done","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"}],"climate/exceptions.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"3d18d7db9f98ce8e388463c17888dd72869d97d1","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# implied."},{"line_number":14,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"# limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from climate.openstack.common.gettextutils import _"},{"line_number":18,"context_line":"from climate.openstack.common import log as logging"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B2Jo%3D","line":16,"updated":"2013-11-19 12:33:58.000000000","message":"Please no, don\u0027t build this kind of file, it\u0027s awful.\n\nPut exceptions where they logically should be, i.e. where they are raised in the first place or in their subsystem.","commit_id":"04a17feefb5d8e8cafd757c1ba3339b78989f8d2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"3c7339a4ddc5d8e1c5a061011b5de858452b940f","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    code \u003d 404"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class NotAuthorized(ClimateException):"},{"line_number":64,"context_line":"    msg_fmt \u003d _(\"Not authorized.\")"},{"line_number":65,"context_line":"    code \u003d 403"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BohA%3D","line":63,"updated":"2013-11-22 08:01:47.000000000","message":"Don\u0027t put exceptions in this file.\n\nThis file should not exist. Put exceptions where they belong too logically.","commit_id":"9fe1471cf5c73c8ae2a2635407b91c8ee81b92e3"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"43c8d3768b27623e2a7f2ce5b3f2ade8bb5387b1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    code \u003d 404"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class NotAuthorized(ClimateException):"},{"line_number":64,"context_line":"    msg_fmt \u003d _(\"Not authorized.\")"},{"line_number":65,"context_line":"    code \u003d 403"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BobY%3D","line":63,"in_reply_to":"AAAATn%2F%2BohA%3D","updated":"2013-11-22 08:21:41.000000000","message":"Let\u0027s discuss that by email, I disagree with you based on a quick review of Openstack projects having a global file for exceptions.","commit_id":"9fe1471cf5c73c8ae2a2635407b91c8ee81b92e3"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2d43c8e72710ad200d97f72af78fb2bed500c109","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        if not message:"},{"line_number":43,"context_line":"            try:"},{"line_number":44,"context_line":"                message \u003d self.msg_fmt % kwargs"},{"line_number":45,"context_line":"            except Exception:"},{"line_number":46,"context_line":"                # kwargs doesn\u0027t match a variable in the message"},{"line_number":47,"context_line":"                # log the issue and the kwargs"},{"line_number":48,"context_line":"                LOG.exception(_(\u0027Exception in string format operation\u0027))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Bghw%3D","line":45,"updated":"2013-11-25 11:03:02.000000000","message":"You should catch more specific KeyError exception here.","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        if not message:"},{"line_number":43,"context_line":"            try:"},{"line_number":44,"context_line":"                message \u003d self.msg_fmt % kwargs"},{"line_number":45,"context_line":"            except Exception:"},{"line_number":46,"context_line":"                # kwargs doesn\u0027t match a variable in the message"},{"line_number":47,"context_line":"                # log the issue and the kwargs"},{"line_number":48,"context_line":"                LOG.exception(_(\u0027Exception in string format operation\u0027))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BftY%3D","line":45,"in_reply_to":"AAAATn%2F%2Bghw%3D","updated":"2013-11-25 14:09:50.000000000","message":"Done","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"60469a10dc3068ffca9ab10f5ba4214882454ad5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        super(ClimateException, self).__init__(message)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class NotFound(ClimateException):"},{"line_number":58,"context_line":"    \"\"\"Object not found exception.\"\"\""},{"line_number":59,"context_line":"    msg_fmt \u003d _(\"Object with %(object)s not found.\")"},{"line_number":60,"context_line":"    code \u003d 404"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Bf1M%3D","line":57,"updated":"2013-11-25 13:40:16.000000000","message":"That and all below should be in API, not there.","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        super(ClimateException, self).__init__(message)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class NotFound(ClimateException):"},{"line_number":58,"context_line":"    \"\"\"Object not found exception.\"\"\""},{"line_number":59,"context_line":"    msg_fmt \u003d _(\"Object with %(object)s not found.\")"},{"line_number":60,"context_line":"    code \u003d 404"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Bfuc%3D","line":57,"in_reply_to":"AAAATn%2F%2Bf1M%3D","updated":"2013-11-25 14:09:50.000000000","message":"Ok, I got your point, that will be addressed in a separate bugfile.","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2d43c8e72710ad200d97f72af78fb2bed500c109","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    \"\"\"Object not found exception.\"\"\""},{"line_number":59,"context_line":"    msg_fmt \u003d _(\"Object with %(object)s not found.\")"},{"line_number":60,"context_line":"    code \u003d 404"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class NotAuthorized(ClimateException):"},{"line_number":64,"context_line":"    msg_fmt \u003d _(\"Not authorized.\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Bghg%3D","line":61,"updated":"2013-11-25 11:03:02.000000000","message":"Changes before this line look unrelated to policy work. They should be done in separate commit.","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    \"\"\"Object not found exception.\"\"\""},{"line_number":59,"context_line":"    msg_fmt \u003d _(\"Object with %(object)s not found.\")"},{"line_number":60,"context_line":"    code \u003d 404"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"class NotAuthorized(ClimateException):"},{"line_number":64,"context_line":"    msg_fmt \u003d _(\"Not authorized.\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Bfuo%3D","line":61,"in_reply_to":"AAAATn%2F%2Bghg%3D","updated":"2013-11-25 14:09:50.000000000","message":"Done","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"}],"climate/policy.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2d43c8e72710ad200d97f72af78fb2bed500c109","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                             **extra)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def check_is_admin(context):"},{"line_number":102,"context_line":"    \"\"\"Whether or not roles contains \u0027admin\u0027 role according to policy setting."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BgiM%3D","line":101,"updated":"2013-11-25 11:03:02.000000000","message":"This check should be implemented by enforcing appropriate rule for the action and adding \"context_is_admin\" there.\n\nThis method should not be used directly.","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                             **extra)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def check_is_admin(context):"},{"line_number":102,"context_line":"    \"\"\"Whether or not roles contains \u0027admin\u0027 role according to policy setting."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BftQ%3D","line":101,"in_reply_to":"AAAATn%2F%2BgiM%3D","updated":"2013-11-25 14:09:50.000000000","message":"Let\u0027s discuss that by IRC","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"449d13da2ef047f5ce025f639261235d3e3b260e","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def authorize(extension, api\u003d\u0027climate\u0027,"},{"line_number":102,"context_line":"              context\u003dNone, target\u003dNone, action\u003dNone):"},{"line_number":103,"context_line":"    def decorator(func):"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        @functools.wraps(func)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BQPA%3D","line":102,"updated":"2013-11-28 10:01:45.000000000","message":"How about moving action to the 2nd place in the arg list so that we can do\n\n    @policy.authorize(\u0027leases\u0027, \u0027get\u0027)","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0665ea32ab83b85a05af193cc89ac88ab39591ea","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def authorize(extension, api\u003d\u0027climate\u0027,"},{"line_number":102,"context_line":"              context\u003dNone, target\u003dNone, action\u003dNone):"},{"line_number":103,"context_line":"    def decorator(func):"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        @functools.wraps(func)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BP%2BE%3D","line":102,"in_reply_to":"AAAATn%2F%2BQPA%3D","updated":"2013-11-28 11:39:16.000000000","message":"Done","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"_ENFORCER \u003d None"},{"line_number":31,"context_line":"_POLICY_PATH \u003d None"},{"line_number":32,"context_line":"_POLICY_CACHE \u003d {}"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def reset():"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOq8%3D","line":32,"updated":"2013-11-28 17:00:36.000000000","message":"_PATH and _CACHE are not used anywhere.","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def set_rules(data, default_rule\u003dNone):"},{"line_number":51,"context_line":"    global _ENFORCER"},{"line_number":52,"context_line":"    default_rule \u003d default_rule or CONF.policy_default_rule"},{"line_number":53,"context_line":"    if not _ENFORCER:"},{"line_number":54,"context_line":"        LOG.debug(\"Enforcer not present, recreating at rules stage.\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOq4%3D","line":51,"updated":"2013-11-28 17:00:36.000000000","message":"This is not needed here","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":80,"context_line":"           authorized, and the exact value False if not authorized and"},{"line_number":81,"context_line":"           do_raise is False."},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":"    global _ENFORCER"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    init()"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOqs%3D","line":83,"updated":"2013-11-28 17:00:36.000000000","message":"ditto","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"df20dd90049dbbd18d7c4091937027c7f305db3a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        extra.update(exc\u003dexceptions.PolicyNotAuthorized, action\u003daction)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    # NOTE (sbauza): We need to force reloading of rules as it doesn\u0027t"},{"line_number":95,"context_line":"    #   autodetect that the file has changed."},{"line_number":96,"context_line":"    _ENFORCER.load_rules(force_reload\u003dTrue)"},{"line_number":97,"context_line":"    return _ENFORCER.enforce(action, target, credentials, do_raise\u003ddo_raise,"},{"line_number":98,"context_line":"                             **extra)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOYw%3D","line":95,"updated":"2013-11-28 17:28:17.000000000","message":"Please fix indent here.","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"df20dd90049dbbd18d7c4091937027c7f305db3a","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                             **extra)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def authorize(extension, action\u003dNone,"},{"line_number":102,"context_line":"              api\u003d\u0027climate\u0027, context\u003dNone, target\u003dNone):"},{"line_number":103,"context_line":"    def decorator(func):"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOYI%3D","line":101,"updated":"2013-11-28 17:28:17.000000000","message":"It will look nicer if all args that can be placed on first line will be there.","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        def wrapped(self, *args, **kwargs):"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"            if context is None:"},{"line_number":109,"context_line":"                ctx \u003d context_.current()"},{"line_number":110,"context_line":"            else:"},{"line_number":111,"context_line":"                ctx \u003d context"},{"line_number":112,"context_line":"            if target is None:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOkA%3D","line":109,"updated":"2013-11-28 17:00:36.000000000","message":"Please use the common pattern:\n\n    def f(arg\u003dNone):\n        if arg is None:\n            arg \u003d \u003c...\u003e\n\nfor all these if\u0027s. else: branches clutter the code.","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                ctx \u003d context"},{"line_number":112,"context_line":"            if target is None:"},{"line_number":113,"context_line":"                tgt \u003d {\u0027tenant_id\u0027: ctx.tenant_id,"},{"line_number":114,"context_line":"                       \u0027user_id\u0027: ctx.user_id}"},{"line_number":115,"context_line":"            else:"},{"line_number":116,"context_line":"                tgt \u003d target"},{"line_number":117,"context_line":"            if action is None:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOjY%3D","line":114,"updated":"2013-11-28 17:00:36.000000000","message":"Target should not contain \u0027user_id\u0027 as per docstring in oslo.policy:\n\n        :param target: As much information about the object being operated\n                    on as possible, as a dictionary.\n\nHere should be information about the object, not the requester.\n\nIn fact we should not add \u0027tenant_id\u0027 from the context here either because otherwise rule \"tenant_id:%(tenant_id)s\" will always succeed.","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"530ffed96b92d90e1081aeaaa51ed1da7b5aebfb","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    # NOTE(sbauza): We need to force reloading of rules as it doesn\u0027t"},{"line_number":91,"context_line":"    # autodetect that the file has changed."},{"line_number":92,"context_line":"    _ENFORCER.load_rules(force_reload\u003dTrue)"},{"line_number":93,"context_line":"    return _ENFORCER.enforce(action, target, credentials, do_raise\u003ddo_raise,"},{"line_number":94,"context_line":"                             **extra)"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F9mMc%3D","line":92,"updated":"2013-12-09 20:38:48.000000000","message":"It sounds like file will be reloaded each time that isn\u0027t good, but in fact it uses fileutils.read_cached_file that checks mtime.","commit_id":"742e373a1920e3e5c6a0f2279e746cc198355f7b"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"530ffed96b92d90e1081aeaaa51ed1da7b5aebfb","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        @functools.wraps(func)"},{"line_number":102,"context_line":"        def wrapped(self, *args, **kwargs):"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            # NOTE(sbauza): Due to F823, we need to affect new vars"},{"line_number":105,"context_line":"            cur_ctx \u003d ctx or context.current()"},{"line_number":106,"context_line":"            tgt \u003d target or {\u0027tenant_id\u0027: cur_ctx.tenant_id,"},{"line_number":107,"context_line":"                             \u0027user_id\u0027: cur_ctx.user_id}"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F9mMM%3D","line":104,"updated":"2013-12-09 20:38:48.000000000","message":"I think that this note should be removed.","commit_id":"742e373a1920e3e5c6a0f2279e746cc198355f7b"}],"climate/tests/__init__.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"3d18d7db9f98ce8e388463c17888dd72869d97d1","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            self.context_mock \u003d self.patch(context.Context, \u0027current\u0027)"},{"line_number":76,"context_line":"        self.context_mock.return_value \u003d ctx"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def flags(self, **kw):"},{"line_number":79,"context_line":"        \"\"\"Override flag variables for a test.\"\"\""},{"line_number":80,"context_line":"        group \u003d kw.pop(\u0027group\u0027, None)"},{"line_number":81,"context_line":"        for k, v in kw.iteritems():"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B2Jk%3D","line":78,"updated":"2013-11-19 12:33:58.000000000","message":"There\u0027s a fixture to do that.","commit_id":"04a17feefb5d8e8cafd757c1ba3339b78989f8d2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"60469a10dc3068ffca9ab10f5ba4214882454ad5","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            self.context_mock \u003d self.patch(context.Context, \u0027current\u0027)"},{"line_number":79,"context_line":"        self.context_mock.return_value \u003d ctx"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def flags(self, **kw):"},{"line_number":82,"context_line":"        \"\"\"Override flag variables for a test.\"\"\""},{"line_number":83,"context_line":"        group \u003d kw.pop(\u0027group\u0027, None)"},{"line_number":84,"context_line":"        for k, v in kw.iteritems():"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Bf1E%3D","line":81,"updated":"2013-11-25 13:40:16.000000000","message":"@staticmethod","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            self.context_mock \u003d self.patch(context.Context, \u0027current\u0027)"},{"line_number":79,"context_line":"        self.context_mock.return_value \u003d ctx"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def flags(self, **kw):"},{"line_number":82,"context_line":"        \"\"\"Override flag variables for a test.\"\"\""},{"line_number":83,"context_line":"        group \u003d kw.pop(\u0027group\u0027, None)"},{"line_number":84,"context_line":"        for k, v in kw.iteritems():"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2Bfv0%3D","line":81,"in_reply_to":"AAAATn%2F%2Bf1E%3D","updated":"2013-11-25 14:09:50.000000000","message":"I prefer it to be called by self.flags(), what do you think of it ?","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9a2be8c18c67c39c5d85a98e755d0ef1fc3498b7","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            self.context_mock \u003d self.patch(context.Context, \u0027current\u0027)"},{"line_number":79,"context_line":"        self.context_mock.return_value \u003d ctx"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def flags(self, **kw):"},{"line_number":82,"context_line":"        \"\"\"Override flag variables for a test.\"\"\""},{"line_number":83,"context_line":"        group \u003d kw.pop(\u0027group\u0027, None)"},{"line_number":84,"context_line":"        for k, v in kw.iteritems():"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2BfoI%3D","line":81,"in_reply_to":"AAAATn%2F%2Bfv0%3D","updated":"2013-11-25 14:23:04.000000000","message":"You can do that with @staticmethod. It just won\u0027t receive self as first argument.","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.context_mock.return_value \u003d ctx"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @staticmethod"},{"line_number":82,"context_line":"    def flags(**kw):"},{"line_number":83,"context_line":"        \"\"\"Override flag variables for a test.\"\"\""},{"line_number":84,"context_line":"        group \u003d kw.pop(\u0027group\u0027, None)"},{"line_number":85,"context_line":"        for k, v in kw.iteritems():"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOis%3D","line":82,"updated":"2013-11-28 17:00:36.000000000","message":"You should use oslo.fixture.config instead. But it is actually not needed here.","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"}],"climate/tests/policy_fixture.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"3d18d7db9f98ce8e388463c17888dd72869d97d1","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        climate.policy.init()"},{"line_number":38,"context_line":"        self.addCleanup(climate.policy.reset)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def set_rules(self, rules, default_rule\u003dNone):"},{"line_number":41,"context_line":"        climate.policy.set_rules(rules, default_rule)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B2Jc%3D","line":40,"updated":"2013-11-19 12:33:58.000000000","message":"@staticmethod\n\nbut not sure this method is really needed.","commit_id":"04a17feefb5d8e8cafd757c1ba3339b78989f8d2"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.policy_file_name \u003d os.path.join(self.policy_dir.path,"},{"line_number":32,"context_line":"                                             \u0027policy.json\u0027)"},{"line_number":33,"context_line":"        with open(self.policy_file_name, \u0027w\u0027) as policy_file:"},{"line_number":34,"context_line":"            policy_file.write(fake_policy.policy_data)"},{"line_number":35,"context_line":"        CONF.set_override(\u0027policy_file\u0027, self.policy_file_name)"},{"line_number":36,"context_line":"        climate.policy.reset()"},{"line_number":37,"context_line":"        climate.policy.init()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOh4%3D","line":34,"updated":"2013-11-28 17:00:36.000000000","message":"You should patch oslo.fileutils.read_cached_file instead to return predefined JSON (which should come from an argument).","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"}],"climate/tests/test_exceptions.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"3c7339a4ddc5d8e1c5a061011b5de858452b940f","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            msg_fmt \u003d \"default message: %(code)s\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        exc \u003d FakeClimateException(code\u003d500)"},{"line_number":37,"context_line":"        self.assertEquals(unicode(exc), \u0027default message: 500\u0027)"},{"line_number":38,"context_line":"        self.assertEquals(exc.message, \u0027default message: 500\u0027)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_error_msg_exception_with_kwargs(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bogw%3D","line":37,"updated":"2013-11-22 08:01:47.000000000","message":"assertEquals is deprecated, use assertEqual\n\nThere\u0027s a hacking check for that, not sure it\u0027s enabled.","commit_id":"9fe1471cf5c73c8ae2a2635407b91c8ee81b92e3"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"43c8d3768b27623e2a7f2ce5b3f2ade8bb5387b1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            msg_fmt \u003d \"default message: %(code)s\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        exc \u003d FakeClimateException(code\u003d500)"},{"line_number":37,"context_line":"        self.assertEquals(unicode(exc), \u0027default message: 500\u0027)"},{"line_number":38,"context_line":"        self.assertEquals(exc.message, \u0027default message: 500\u0027)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_error_msg_exception_with_kwargs(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BoaE%3D","line":37,"in_reply_to":"AAAATn%2F%2Bogw%3D","updated":"2013-11-22 08:21:41.000000000","message":"My pep8 venv was old, I missed the deprecation. Now that I updated it, it complains. Will update it.","commit_id":"9fe1471cf5c73c8ae2a2635407b91c8ee81b92e3"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2d43c8e72710ad200d97f72af78fb2bed500c109","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 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":15,"id":"AAAATn%2F%2BghQ%3D","line":1,"updated":"2013-11-25 11:03:02.000000000","message":"Most of this file should land in separate commit along with exception.py stuff.","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 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":15,"id":"AAAATn%2F%2Bfwo%3D","line":1,"in_reply_to":"AAAATn%2F%2BghQ%3D","updated":"2013-11-25 14:09:50.000000000","message":"Done","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"}],"climate/tests/test_policy.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"449d13da2ef047f5ce025f639261235d3e3b260e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.target \u003d {}"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_modified_policy_reloads(self):"},{"line_number":38,"context_line":"        with utils.tempdir() as tmpdir:"},{"line_number":39,"context_line":"            tmpfilename \u003d os.path.join(tmpdir, \u0027policy\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"            self.flags(policy_file\u003dtmpfilename)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BQLU%3D","line":38,"updated":"2013-11-28 10:01:45.000000000","message":"You should use TempDir fixture in tests instead.","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0665ea32ab83b85a05af193cc89ac88ab39591ea","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.target \u003d {}"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_modified_policy_reloads(self):"},{"line_number":38,"context_line":"        with utils.tempdir() as tmpdir:"},{"line_number":39,"context_line":"            tmpfilename \u003d os.path.join(tmpdir, \u0027policy\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"            self.flags(policy_file\u003dtmpfilename)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BPt0%3D","line":38,"in_reply_to":"AAAATn%2F%2BQLU%3D","updated":"2013-11-28 11:39:16.000000000","message":"Done","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.target \u003d {}"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_modified_policy_reloads(self):"},{"line_number":38,"context_line":"        with self.useFixture(fixtures.TempDir()) as tmpdir:"},{"line_number":39,"context_line":"            tmpfilename \u003d os.path.join(tmpdir.path, \u0027policy\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"            self.flags(policy_file\u003dtmpfilename)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOhc%3D","line":38,"updated":"2013-11-28 17:00:36.000000000","message":"You should move self.useFixture call to setUp.","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"df20dd90049dbbd18d7c4091937027c7f305db3a","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class DefaultPolicyTestCase(tests.TestCase):"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def fake_load_rules(self, force_reload\u003dNone):"},{"line_number":58,"context_line":"        self.policy.set_rules(self.rules, self.default_rule)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOXo%3D","line":57,"updated":"2013-11-28 17:28:17.000000000","message":"force_reload not used","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        self.default_rule \u003d None"},{"line_number":74,"context_line":"        # self.policy \u003d self.useFixture(policy_fixture.PolicyFixture())"},{"line_number":75,"context_line":"        self.patch(policy._ENFORCER, \u0027load_rules\u0027).\\"},{"line_number":76,"context_line":"            side_effect \u003d self.fake_load_rules"},{"line_number":77,"context_line":"        # self._set_rules(\u0027default\u0027)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOgg%3D","line":75,"updated":"2013-11-28 17:00:36.000000000","message":"This is an indirect dependency on whether anyone called policy.init() before or not.","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"}],"climate/utils/__init__.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"449d13da2ef047f5ce025f639261235d3e3b260e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        return getattr(self.instance, __name)(*args, **kwargs)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def read_cached_file(filename, cache_info, reload_func\u003dNone):"},{"line_number":61,"context_line":"    \"\"\"Read from a file if it has been modified."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :param cache_info: dictionary to hold opaque cache."}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BQMQ%3D","line":60,"updated":"2013-11-28 10:01:45.000000000","message":"It looks like this is not used anywhere and duplicates the method from oslo.fileutils.","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0665ea32ab83b85a05af193cc89ac88ab39591ea","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        return getattr(self.instance, __name)(*args, **kwargs)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def read_cached_file(filename, cache_info, reload_func\u003dNone):"},{"line_number":61,"context_line":"    \"\"\"Read from a file if it has been modified."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :param cache_info: dictionary to hold opaque cache."}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BPs4%3D","line":60,"in_reply_to":"AAAATn%2F%2BQMQ%3D","updated":"2013-11-28 11:39:16.000000000","message":"Done","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"449d13da2ef047f5ce025f639261235d3e3b260e","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"@contextlib.contextmanager"},{"line_number":82,"context_line":"def tempdir(**kwargs):"},{"line_number":83,"context_line":"    argdict \u003d kwargs.copy()"},{"line_number":84,"context_line":"    if \u0027dir\u0027 not in argdict:"},{"line_number":85,"context_line":"        argdict[\u0027dir\u0027] \u003d CONF.tempdir"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BQKg%3D","line":82,"updated":"2013-11-28 10:01:45.000000000","message":"As this method is used only in tests, it should be moved to tests/__init__.py.\n\nWell. It looks like it should be even replaced with a fixture.","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0665ea32ab83b85a05af193cc89ac88ab39591ea","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"@contextlib.contextmanager"},{"line_number":82,"context_line":"def tempdir(**kwargs):"},{"line_number":83,"context_line":"    argdict \u003d kwargs.copy()"},{"line_number":84,"context_line":"    if \u0027dir\u0027 not in argdict:"},{"line_number":85,"context_line":"        argdict[\u0027dir\u0027] \u003d CONF.tempdir"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BPr4%3D","line":82,"in_reply_to":"AAAATn%2F%2BQKg%3D","updated":"2013-11-28 11:39:16.000000000","message":"Done","commit_id":"2ec23eddd141d9f0efe60b27a0d097fccded6820"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"276db0970a09c17fda1b3e312ace0f430a7be254","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# implied."},{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"Utilities and helper functions.\"\"\""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F%2BOfY%3D","line":15,"updated":"2013-11-28 17:00:36.000000000","message":"Extra spaces before docstring.\n\nAdding docstring here looks like an unrelated change.","commit_id":"bf3917873896cf0f030bea3e7f507323e0b6e69a"}],"etc/policy.json":[{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"0c20fbf6d59c378715bda980380498f5333a5d58","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"admin\": \"is_admin:True or role:admin or role:masterofuniverse\","},{"line_number":3,"context_line":"    "},{"line_number":4,"context_line":"    \"admin_or_owner\":  \"rule:admin or tenant_id:%(tenant_id)s\","},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \"default\": \"rule:admin_or_owner\","}],"source_content_type":"application/json","patch_set":17,"id":"AAAATn%2F%2Be8A%3D","line":3,"updated":"2013-11-25 16:08:50.000000000","message":"Please remove tab here to the spaces.","commit_id":"13953b19ec2cf38b4b1d313726e208751762daf5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"fbb96c1171a191bb0e05b8c0032e0807aecdf0c9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"admin\": \"is_admin:True or role:admin or role:masterofuniverse\","},{"line_number":3,"context_line":"    "},{"line_number":4,"context_line":"    \"admin_or_owner\":  \"rule:admin or tenant_id:%(tenant_id)s\","},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \"default\": \"rule:admin_or_owner\","}],"source_content_type":"application/json","patch_set":17,"id":"AAAATn%2F%2Be28%3D","line":3,"in_reply_to":"AAAATn%2F%2Be8A%3D","updated":"2013-11-25 16:18:53.000000000","message":"Argh, ST3 killed me.\nDone.","commit_id":"13953b19ec2cf38b4b1d313726e208751762daf5"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"e52704816a11c5d14579a76ba92581a38d753acf","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    \"climate:leases:create\": \"rule:admin_or_owner\","},{"line_number":11,"context_line":"    \"climate:leases:delete\": \"rule:admin_or_owner\","},{"line_number":12,"context_line":"    \"climate:leases:update\": \"rule:admin_or_owner\","},{"line_number":13,"context_line":"    "},{"line_number":14,"context_line":"    \"climate:plugins:get\": \"@\","},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    \"climate:oshosts:get\": \"rule:admin_or_owner\","}],"source_content_type":"application/json","patch_set":26,"id":"AAAAT3%2F%2F%2Fl8%3D","line":13,"updated":"2013-12-25 08:40:48.000000000","message":":( Please remove tab here :(\n\nThat\u0027s only thing I don\u0027t like now, so it would be nice if you\u0027ll fix that asap. I\u0027ll give my +2 then :)\n\nThanks.","commit_id":"5288ea9ef70dd74023dac0050bf241fb4750a304"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b8505cfca5ba023aad90b866cdb1ad1b02755d07","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    \"climate:leases:create\": \"rule:admin_or_owner\","},{"line_number":11,"context_line":"    \"climate:leases:delete\": \"rule:admin_or_owner\","},{"line_number":12,"context_line":"    \"climate:leases:update\": \"rule:admin_or_owner\","},{"line_number":13,"context_line":"    "},{"line_number":14,"context_line":"    \"climate:plugins:get\": \"@\","},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    \"climate:oshosts:get\": \"rule:admin_or_owner\","}],"source_content_type":"application/json","patch_set":26,"id":"AAAAUH%2F%2F4FA%3D","line":13,"in_reply_to":"AAAAT3%2F%2F%2Fl8%3D","updated":"2014-01-07 11:31:25.000000000","message":"Damn, stupid IDE...\nDone.","commit_id":"5288ea9ef70dd74023dac0050bf241fb4750a304"}],"tox.ini":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"60469a10dc3068ffca9ab10f5ba4214882454ad5","unresolved":false,"context_lines":[{"line_number":41,"context_line":"exclude\u003d.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,tools"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"[hacking]"},{"line_number":44,"context_line":"import_exceptions\u003dnova"}],"source_content_type":"text/x-properties","patch_set":15,"id":"AAAATn%2F%2Bf1A%3D","line":44,"updated":"2013-11-25 13:40:16.000000000","message":"?","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0d2531918bd1fef3072b742135b8a59fdd8314b5","unresolved":false,"context_lines":[{"line_number":41,"context_line":"exclude\u003d.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,tools"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"[hacking]"},{"line_number":44,"context_line":"import_exceptions\u003dnova"}],"source_content_type":"text/x-properties","patch_set":15,"id":"AAAATn%2F%2Bfws%3D","line":44,"in_reply_to":"AAAATn%2F%2Bf1A%3D","updated":"2013-11-25 14:09:50.000000000","message":"Bad commit, was containing previous test, removing it.","commit_id":"15324de22967f878b7570fa598516216f39d2a3b"}]}
