)]}'
{"watcher/api/controllers/v1/audit.py":[{"author":{"_account_id":21692,"name":"licanwei","email":"li.canwei2@zte.com.cn","username":"licanwei"},"change_message_id":"39c6c310c291c83b4eda41cd2eb3fd5fe0e850e7","unresolved":false,"context_lines":[{"line_number":575,"context_line":"            audit \u003d Audit(**api_utils.apply_jsonpatch(audit_dict, patch))"},{"line_number":576,"context_line":"            old_state \u003d audit_dict[\u0027state\u0027]"},{"line_number":577,"context_line":"            new_state \u003d api_utils.patch_state(patch)"},{"line_number":578,"context_line":"            for k, v in AUDIT_STATE.items():"},{"line_number":579,"context_line":"                if old_state \u003d\u003d k:"},{"line_number":580,"context_line":"                    if new_state is not None and new_state not in v:"},{"line_number":581,"context_line":"                        raise exception.InvalidAuditState("},{"line_number":582,"context_line":"                            old_state\u003dold_state, new_state\u003dnew_state)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a430d35_f53248f1","line":579,"range":{"start_line":578,"start_character":0,"end_line":579,"end_character":34},"updated":"2017-02-07 08:15:00.000000000","message":"recommendation:\nv \u003d AUDIT_STATE.get(old_state)","commit_id":"599f910a36ad8793bd375dfd96561c03aa820550"},{"author":{"_account_id":13111,"name":"Hidekazu Nakamura","email":"hidekazuna@gmail.com","username":"hid-nakamura"},"change_message_id":"cd0dcfb4c6708144abe789a9713fd4e0036c04c2","unresolved":false,"context_lines":[{"line_number":575,"context_line":"            audit \u003d Audit(**api_utils.apply_jsonpatch(audit_dict, patch))"},{"line_number":576,"context_line":"            old_state \u003d audit_dict[\u0027state\u0027]"},{"line_number":577,"context_line":"            new_state \u003d api_utils.patch_state(patch)"},{"line_number":578,"context_line":"            for k, v in AUDIT_STATE.items():"},{"line_number":579,"context_line":"                if old_state \u003d\u003d k:"},{"line_number":580,"context_line":"                    if new_state is not None and new_state not in v:"},{"line_number":581,"context_line":"                        raise exception.InvalidAuditState("},{"line_number":582,"context_line":"                            old_state\u003dold_state, new_state\u003dnew_state)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a430d35_07f089c8","line":579,"range":{"start_line":578,"start_character":0,"end_line":579,"end_character":34},"in_reply_to":"1a430d35_f53248f1","updated":"2017-02-07 09:37:12.000000000","message":"Done","commit_id":"599f910a36ad8793bd375dfd96561c03aa820550"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"bcb617a9cb1bb315ee38a60fff36680a04f233ec","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        [objects.audit.State.DELETED],"},{"line_number":63,"context_line":"    objects.audit.State.CANCELLED:"},{"line_number":64,"context_line":"        [objects.audit.State.DELETED]"},{"line_number":65,"context_line":"    }"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class AuditPostType(wtypes.Base):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_da01f439","line":65,"updated":"2017-02-07 10:21:35.000000000","message":"You forgot to handle the DELETED entry, which means that the test you make later on will break:\n\n    permitted_states \u003d AUDIT_STATE.get(old_state)  # Returns None\n    new_state not in permitted_states  # Raises a TypeError\n\nAlso, I would rename AUDIT_STATE to something like ALLOWED_AUDIT_TRANSITIONS.","commit_id":"6bb1f5035da10e994bcebecc6eed6abfc8b2ee90"},{"author":{"_account_id":13111,"name":"Hidekazu Nakamura","email":"hidekazuna@gmail.com","username":"hid-nakamura"},"change_message_id":"19484f38b5afe16ec0983fabcaf24345eb0d1664","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        [objects.audit.State.DELETED],"},{"line_number":63,"context_line":"    objects.audit.State.CANCELLED:"},{"line_number":64,"context_line":"        [objects.audit.State.DELETED]"},{"line_number":65,"context_line":"    }"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class AuditPostType(wtypes.Base):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_14f4d158","line":65,"in_reply_to":"1a430d35_da01f439","updated":"2017-02-09 05:29:41.000000000","message":"Done","commit_id":"6bb1f5035da10e994bcebecc6eed6abfc8b2ee90"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"bcb617a9cb1bb315ee38a60fff36680a04f233ec","unresolved":false,"context_lines":[{"line_number":578,"context_line":""},{"line_number":579,"context_line":"        old_state \u003d audit_dict[\u0027state\u0027]"},{"line_number":580,"context_line":"        new_state \u003d api_utils.patch_state(patch)"},{"line_number":581,"context_line":"        permitted_states \u003d AUDIT_STATE.get(old_state)"},{"line_number":582,"context_line":"        if new_state is not None and new_state not in permitted_states:"},{"line_number":583,"context_line":"            raise exception.InvalidAuditState("},{"line_number":584,"context_line":"                old_state\u003dold_state, new_state\u003dnew_state)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_faa87022","line":581,"range":{"start_line":581,"start_character":27,"end_line":581,"end_character":53},"updated":"2017-02-07 10:21:35.000000000","message":"Can you add a default value to this call so you avoid a TypeError in case a new state is added in the future?\n\n    permitted_states \u003d AUDIT_STATE.get(old_state, [])","commit_id":"6bb1f5035da10e994bcebecc6eed6abfc8b2ee90"},{"author":{"_account_id":13111,"name":"Hidekazu Nakamura","email":"hidekazuna@gmail.com","username":"hid-nakamura"},"change_message_id":"19484f38b5afe16ec0983fabcaf24345eb0d1664","unresolved":false,"context_lines":[{"line_number":578,"context_line":""},{"line_number":579,"context_line":"        old_state \u003d audit_dict[\u0027state\u0027]"},{"line_number":580,"context_line":"        new_state \u003d api_utils.patch_state(patch)"},{"line_number":581,"context_line":"        permitted_states \u003d AUDIT_STATE.get(old_state)"},{"line_number":582,"context_line":"        if new_state is not None and new_state not in permitted_states:"},{"line_number":583,"context_line":"            raise exception.InvalidAuditState("},{"line_number":584,"context_line":"                old_state\u003dold_state, new_state\u003dnew_state)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_54ead974","line":581,"range":{"start_line":581,"start_character":27,"end_line":581,"end_character":53},"in_reply_to":"1a430d35_faa87022","updated":"2017-02-09 05:29:41.000000000","message":"Done","commit_id":"6bb1f5035da10e994bcebecc6eed6abfc8b2ee90"}],"watcher/api/controllers/v1/utils.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"bcb617a9cb1bb315ee38a60fff36680a04f233ec","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    return jsonpatch.apply_patch(doc, jsonpatch.JsonPatch(patch))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def patch_state(patch):"},{"line_number":77,"context_line":"    for p in patch:"},{"line_number":78,"context_line":"        if p[\u0027op\u0027] \u003d\u003d \u0027replace\u0027 and p[\u0027path\u0027] \u003d\u003d \u0027/state\u0027:"},{"line_number":79,"context_line":"            return p[\u0027value\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_9d5a0629","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":15},"updated":"2017-02-07 10:21:35.000000000","message":"The name of this function is misleading: it doesn\u0027t patch the state, instead it extracts the possible value for a patch on /state. So IMHO, I would rename it to something like get_patch_value() to make it more generic and write it like:\n\n    def get_patch_value(patch, key):\n        for p in patch:\n            if p[\u0027op\u0027] \u003d\u003d \u0027replace\u0027 and p[\u0027path\u0027] \u003d\u003d \u0027/%s\u0027 % key:\n                return p[\u0027value\u0027]\n\n    utils.get_patch_value(patch, \u0027state\u0027)","commit_id":"6bb1f5035da10e994bcebecc6eed6abfc8b2ee90"},{"author":{"_account_id":13111,"name":"Hidekazu Nakamura","email":"hidekazuna@gmail.com","username":"hid-nakamura"},"change_message_id":"19484f38b5afe16ec0983fabcaf24345eb0d1664","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    return jsonpatch.apply_patch(doc, jsonpatch.JsonPatch(patch))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def patch_state(patch):"},{"line_number":77,"context_line":"    for p in patch:"},{"line_number":78,"context_line":"        if p[\u0027op\u0027] \u003d\u003d \u0027replace\u0027 and p[\u0027path\u0027] \u003d\u003d \u0027/state\u0027:"},{"line_number":79,"context_line":"            return p[\u0027value\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_34e70dad","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":15},"in_reply_to":"1a430d35_9d5a0629","updated":"2017-02-09 05:29:41.000000000","message":"Done","commit_id":"6bb1f5035da10e994bcebecc6eed6abfc8b2ee90"}],"watcher/common/exception.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"bcb617a9cb1bb315ee38a60fff36680a04f233ec","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                \"plans\")"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"class InvalidAuditState(Invalid):"},{"line_number":257,"context_line":"    msg_fmt \u003d _(\"Updating audit state %(old_state)s to %(new_state)s\""},{"line_number":258,"context_line":"                \" is not allowed\")"},{"line_number":259,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_9db766f4","line":256,"range":{"start_line":256,"start_character":6,"end_line":256,"end_character":23},"updated":"2017-02-07 10:21:35.000000000","message":"This exception should be consistent with the one used in action plan API (see https://github.com/openstack/watcher/blob/master/watcher/api/controllers/v1/action_plan.py#L492-L517). So IMHO, you should make it inherit from PatchError instead.","commit_id":"6bb1f5035da10e994bcebecc6eed6abfc8b2ee90"},{"author":{"_account_id":13111,"name":"Hidekazu Nakamura","email":"hidekazuna@gmail.com","username":"hid-nakamura"},"change_message_id":"19484f38b5afe16ec0983fabcaf24345eb0d1664","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                \"plans\")"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"class InvalidAuditState(Invalid):"},{"line_number":257,"context_line":"    msg_fmt \u003d _(\"Updating audit state %(old_state)s to %(new_state)s\""},{"line_number":258,"context_line":"                \" is not allowed\")"},{"line_number":259,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_9400c135","line":256,"range":{"start_line":256,"start_character":6,"end_line":256,"end_character":23},"in_reply_to":"1a430d35_9db766f4","updated":"2017-02-09 05:29:41.000000000","message":"Done","commit_id":"6bb1f5035da10e994bcebecc6eed6abfc8b2ee90"}]}
