)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"78c2b823c0d17ee144f0c9c42a6121383f8f5b4a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Extend capabilities to clean up old executions"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* Added a configuration to the expiration policy"},{"line_number":10,"context_line":"  to filter out workflow states."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-Bug: #1796627"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_e13fdab2","line":9,"range":{"start_line":9,"start_character":10,"end_line":9,"end_character":23},"updated":"2019-10-07 04:36:55.000000000","message":"-\u003e configuration option","commit_id":"2d7cea8b12609f7be36aa53dc8739ec1140eb39f"}],"mistral/config.py":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"78c2b823c0d17ee144f0c9c42a6121383f8f5b4a","unresolved":false,"context_lines":[{"line_number":447,"context_line":"               \u0027that is going to be deleted.\u0027)"},{"line_number":448,"context_line":"    ),"},{"line_number":449,"context_line":"    cfg.ListOpt("},{"line_number":450,"context_line":"        \u0027filtered_states\u0027,"},{"line_number":451,"context_line":"        default\u003d[],"},{"line_number":452,"context_line":"        help\u003d_(\u0027The states that the expiration_policy will filter \u0027"},{"line_number":453,"context_line":"               \u0027out and will not delete.\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_41ceeeb4","line":450,"range":{"start_line":450,"start_character":9,"end_line":450,"end_character":17},"updated":"2019-10-07 04:36:55.000000000","message":"I think the name of the option is not semantically correct. When I read it I perceive \"filtered\" as \"selected\" or \"retained\" which is the opposite to the real use of this option. It should be either something from \"filtered_out_states\", \"ignored_states\" (or \"ignore_states\") or the use (and the docs) should change.\n\nBtw, in the description of the option please name all valid states that can be put into this list. And during the startup of the expiration policy we need to check if the specified list of states is valid (e.g. it doesn\u0027t contain non-terminal states).","commit_id":"2d7cea8b12609f7be36aa53dc8739ec1140eb39f"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"78c2b823c0d17ee144f0c9c42a6121383f8f5b4a","unresolved":false,"context_lines":[{"line_number":449,"context_line":"    cfg.ListOpt("},{"line_number":450,"context_line":"        \u0027filtered_states\u0027,"},{"line_number":451,"context_line":"        default\u003d[],"},{"line_number":452,"context_line":"        help\u003d_(\u0027The states that the expiration_policy will filter \u0027"},{"line_number":453,"context_line":"               \u0027out and will not delete.\u0027)"},{"line_number":454,"context_line":"    )"},{"line_number":455,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_21565208","line":452,"range":{"start_line":452,"start_character":46,"end_line":452,"end_character":47},"updated":"2019-10-07 04:36:55.000000000","message":"The underscore is not needed here. When it comes to comments/docs we just use the natural language to describe everything. So in this case it will be just \"expiration policy\". We should use special characters, capitals etc. if we need to precisely refer to a variable name, class name, function name, config option name, module name etc.","commit_id":"2d7cea8b12609f7be36aa53dc8739ec1140eb39f"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"5e6a57e4eface183dfb0dd5ca6cf23fd873fcdec","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        default\u003d[],"},{"line_number":452,"context_line":"        help\u003d_(\u0027The states that the expiration policy will filter \u0027"},{"line_number":453,"context_line":"               \u0027out and will not delete.\u0027"},{"line_number":454,"context_line":"               \u0027Valid values are, ERROR, CANCELLED, SUCCESS.\u0027)"},{"line_number":455,"context_line":"    )"},{"line_number":456,"context_line":"]"},{"line_number":457,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_c1522536","line":454,"range":{"start_line":454,"start_character":34,"end_line":454,"end_character":59},"updated":"2019-11-06 05:58:36.000000000","message":"if you move the definition to the states module, you can reference it from here too.","commit_id":"0da193535b072b106eb8effabf91ce0852c29195"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3bc7edaba8aaea61c409db038541a75318835441","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        default\u003d[],"},{"line_number":452,"context_line":"        help\u003d_(\u0027The states that the expiration policy will filter \u0027"},{"line_number":453,"context_line":"               \u0027out and will not delete.\u0027"},{"line_number":454,"context_line":"               \u0027Valid values are, ERROR, CANCELLED, SUCCESS.\u0027)"},{"line_number":455,"context_line":"    )"},{"line_number":456,"context_line":"]"},{"line_number":457,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_dfdd1cde","line":454,"range":{"start_line":454,"start_character":34,"end_line":454,"end_character":59},"in_reply_to":"3fa7e38b_c1522536","updated":"2019-11-06 09:35:54.000000000","message":"Good idea, yes.","commit_id":"0da193535b072b106eb8effabf91ce0852c29195"}],"mistral/db/v2/sqlalchemy/api.py":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"78c2b823c0d17ee144f0c9c42a6121383f8f5b4a","unresolved":false,"context_lines":[{"line_number":1393,"context_line":"def _get_completed_root_executions_query(columns):"},{"line_number":1394,"context_line":"    query \u003d b.model_query(models.WorkflowExecution, columns\u003dcolumns)"},{"line_number":1395,"context_line":""},{"line_number":1396,"context_line":"    complete_states \u003d [states.SUCCESS,"},{"line_number":1397,"context_line":"                       states.ERROR,"},{"line_number":1398,"context_line":"                       states.CANCELLED,"},{"line_number":1399,"context_line":"                       ]"},{"line_number":1400,"context_line":"    # this is an empty list by default."},{"line_number":1401,"context_line":"    filtered_states \u003d CONF.execution_expiration_policy.filtered_states"},{"line_number":1402,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_c1441e4a","line":1399,"range":{"start_line":1396,"start_character":4,"end_line":1399,"end_character":24},"updated":"2019-10-07 04:36:55.000000000","message":"Soft: I\u0027d recommend to use the following format:\n\nterminal_states \u003d [\n    states.SUCCESS,\n    states.ERROR,\n    states.CANCELLED\n]","commit_id":"2d7cea8b12609f7be36aa53dc8739ec1140eb39f"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"78c2b823c0d17ee144f0c9c42a6121383f8f5b4a","unresolved":false,"context_lines":[{"line_number":1397,"context_line":"                       states.ERROR,"},{"line_number":1398,"context_line":"                       states.CANCELLED,"},{"line_number":1399,"context_line":"                       ]"},{"line_number":1400,"context_line":"    # this is an empty list by default."},{"line_number":1401,"context_line":"    filtered_states \u003d CONF.execution_expiration_policy.filtered_states"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"    wanted_states \u003d \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_013b16c8","line":1400,"range":{"start_line":1400,"start_character":6,"end_line":1400,"end_character":7},"updated":"2019-10-07 04:36:55.000000000","message":"Please start comments with capital letters.","commit_id":"2d7cea8b12609f7be36aa53dc8739ec1140eb39f"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"78c2b823c0d17ee144f0c9c42a6121383f8f5b4a","unresolved":false,"context_lines":[{"line_number":1400,"context_line":"    # this is an empty list by default."},{"line_number":1401,"context_line":"    filtered_states \u003d CONF.execution_expiration_policy.filtered_states"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"    wanted_states \u003d \\"},{"line_number":1404,"context_line":"        [state for state in complete_states if state not in filtered_states]"},{"line_number":1405,"context_line":"    # Only WorkflowExecution that are not a child of other WorkflowExecution."},{"line_number":1406,"context_line":"    query \u003d query.filter("},{"line_number":1407,"context_line":"        models.WorkflowExecution.task_execution_id \u003d\u003d sa.null()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_c1e09e29","line":1404,"range":{"start_line":1403,"start_character":4,"end_line":1404,"end_character":76},"updated":"2019-10-07 04:36:55.000000000","message":"I\u0027d probably do something like:\n\ndesired_states \u003d {states.SUCCESS, states.ERROR, states.CANCELLED} - set(CONF.execution_expiration_policy.filtered_states)\n\nI\u0027d be more concise and readable because we\u0027d clearly distract one set of states from another one.","commit_id":"2d7cea8b12609f7be36aa53dc8739ec1140eb39f"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"78c2b823c0d17ee144f0c9c42a6121383f8f5b4a","unresolved":false,"context_lines":[{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"    wanted_states \u003d \\"},{"line_number":1404,"context_line":"        [state for state in complete_states if state not in filtered_states]"},{"line_number":1405,"context_line":"    # Only WorkflowExecution that are not a child of other WorkflowExecution."},{"line_number":1406,"context_line":"    query \u003d query.filter("},{"line_number":1407,"context_line":"        models.WorkflowExecution.task_execution_id \u003d\u003d sa.null()"},{"line_number":1408,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e1db5a7a","line":1405,"range":{"start_line":1405,"start_character":11,"end_line":1405,"end_character":28},"updated":"2019-10-07 04:36:55.000000000","message":"-\u003e workflow executions that are not children of other workflow executions","commit_id":"2d7cea8b12609f7be36aa53dc8739ec1140eb39f"},{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"5d66e5426f73b6b5dbdf398b2f09e3f8e3ff5fe2","unresolved":false,"context_lines":[{"line_number":1401,"context_line":"    ignored_states \u003d CONF.execution_expiration_policy.ignored_states"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":""},{"line_number":1404,"context_line":"    def validate_ignored_states(states_to_validate):"},{"line_number":1405,"context_line":"        for state in states_to_validate:"},{"line_number":1406,"context_line":"            if state not in terminal_states:"},{"line_number":1407,"context_line":"                raise ValueError(\u0027{} is not a terminal state.\u0027.format(state))"},{"line_number":1408,"context_line":""},{"line_number":1409,"context_line":"    validate_ignored_states(ignored_states)"},{"line_number":1410,"context_line":"    desired_states \u003d terminal_states - set(ignored_states)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_240e60e5","line":1407,"range":{"start_line":1404,"start_character":3,"end_line":1407,"end_character":77},"updated":"2019-10-07 08:02:38.000000000","message":"I don\u0027t think this is necessary you can force only valid options in the config using choice","commit_id":"d7b012ec2a68963fc7a56f930547e3770238e47b"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"4f85f0897c816f91b3b4b50fc9f3648e8ae52e18","unresolved":false,"context_lines":[{"line_number":1400,"context_line":"    # This is an empty list by default."},{"line_number":1401,"context_line":"    ignored_states \u003d CONF.execution_expiration_policy.ignored_states"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"    def check_ignored_states(states_to_validate):"},{"line_number":1404,"context_line":"        for state in states_to_validate:"},{"line_number":1405,"context_line":"            if state not in terminal_states:"},{"line_number":1406,"context_line":"                raise ValueError(\u0027{} is not a terminal state.\u0027.format(state))"},{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    check_ignored_states(ignored_states)"},{"line_number":1409,"context_line":"    desired_states \u003d terminal_states - set(ignored_states)"},{"line_number":1410,"context_line":""},{"line_number":1411,"context_line":"    # Only workflow executions that are not a child of"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_78cb7049","line":1408,"range":{"start_line":1403,"start_character":4,"end_line":1408,"end_character":40},"updated":"2019-10-09 08:48:52.000000000","message":"It doesn\u0027t make sense to validate config options here. It should happen only once during startup. Please move this logic into setup() of the expiration policy.","commit_id":"dc5c95ab6c439710fb83a70cbf61fe2bb7fb7ebd"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"5e6a57e4eface183dfb0dd5ca6cf23fd873fcdec","unresolved":false,"context_lines":[{"line_number":1393,"context_line":"def _get_completed_root_executions_query(columns):"},{"line_number":1394,"context_line":"    query \u003d b.model_query(models.WorkflowExecution, columns\u003dcolumns)"},{"line_number":1395,"context_line":""},{"line_number":1396,"context_line":"    terminal_states \u003d {states.SUCCESS,"},{"line_number":1397,"context_line":"                       states.ERROR,"},{"line_number":1398,"context_line":"                       states.CANCELLED,"},{"line_number":1399,"context_line":"                       }"},{"line_number":1400,"context_line":"    # This is an empty list by default."},{"line_number":1401,"context_line":"    ignored_states \u003d CONF.execution_expiration_policy.ignored_states"},{"line_number":1402,"context_line":"    desired_states \u003d terminal_states - set(ignored_states)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_41471579","line":1399,"range":{"start_line":1396,"start_character":4,"end_line":1399,"end_character":24},"updated":"2019-11-06 05:58:36.000000000","message":"as this is used elsewhere too, please move this definition to the states module.","commit_id":"0da193535b072b106eb8effabf91ce0852c29195"}],"mistral/services/expiration_policy.py":[{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"5e6a57e4eface183dfb0dd5ca6cf23fd873fcdec","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                       }"},{"line_number":139,"context_line":"    for state in ignored_states:"},{"line_number":140,"context_line":"        if state not in terminal_states:"},{"line_number":141,"context_line":"            raise ValueError(\u0027{} is not a terminal state.\u0027.format(state))"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"def setup():"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_6148118a","line":141,"range":{"start_line":141,"start_character":56,"end_line":141,"end_character":57},"updated":"2019-11-06 05:58:36.000000000","message":"please add the valid values here.","commit_id":"0da193535b072b106eb8effabf91ce0852c29195"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"3bc7edaba8aaea61c409db038541a75318835441","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                       }"},{"line_number":139,"context_line":"    for state in ignored_states:"},{"line_number":140,"context_line":"        if state not in terminal_states:"},{"line_number":141,"context_line":"            raise ValueError(\u0027{} is not a terminal state.\u0027.format(state))"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"def setup():"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_ffffb832","line":141,"range":{"start_line":141,"start_character":56,"end_line":141,"end_character":57},"in_reply_to":"3fa7e38b_6148118a","updated":"2019-11-06 09:35:54.000000000","message":"Andras, what do you mean here?","commit_id":"0da193535b072b106eb8effabf91ce0852c29195"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"92162f709379bca774fbcc2a2e0169bae132c986","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                       }"},{"line_number":139,"context_line":"    for state in ignored_states:"},{"line_number":140,"context_line":"        if state not in terminal_states:"},{"line_number":141,"context_line":"            raise ValueError(\u0027{} is not a terminal state.\u0027.format(state))"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"def setup():"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_3a7a3e77","line":141,"range":{"start_line":141,"start_character":56,"end_line":141,"end_character":57},"in_reply_to":"3fa7e38b_ffffb832","updated":"2019-11-06 10:10:12.000000000","message":"We should add the list of accepted values in the error message to help the user by not having to look up those. Having the \"this is not what I expected\" but not telling what you expected kind of message drives me crazy. :)","commit_id":"0da193535b072b106eb8effabf91ce0852c29195"}],"mistral/tests/unit/services/test_expiration_policy.py":[{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"78c2b823c0d17ee144f0c9c42a6121383f8f5b4a","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            older_than\u003d30,"},{"line_number":179,"context_line":"            filtered_states\u003d[\u0027SUCCESS\u0027]"},{"line_number":180,"context_line":"        )"},{"line_number":181,"context_line":"        expiration_policy.run_execution_expiration_policy(self, ctx)"},{"line_number":182,"context_line":"        execs \u003d db_api.get_expired_executions(now)"},{"line_number":183,"context_line":"        self.assertEqual(1, len(execs))"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_21cbb2a5","line":181,"updated":"2019-10-07 04:36:55.000000000","message":"Soft: I\u0027d recommend to put blank lines between different logical units. In this case I\u0027d put a blank line before running the expiration policy and right after it so that we clearly see where the main call is and where the preparation and the assertion blocks are.\n\nBut that is not a critical thing, of course.","commit_id":"2d7cea8b12609f7be36aa53dc8739ec1140eb39f"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"5e6a57e4eface183dfb0dd5ca6cf23fd873fcdec","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        expiration_policy.run_execution_expiration_policy(self, ctx)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        execs \u003d db_api.get_expired_executions(now)"},{"line_number":185,"context_line":"        self.assertEqual(1, len(execs))"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        _set_expiration_policy_config("},{"line_number":188,"context_line":"            evaluation_interval\u003d1,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_e172c1e4","line":185,"range":{"start_line":185,"start_character":8,"end_line":185,"end_character":39},"updated":"2019-11-06 05:58:36.000000000","message":"it may be better to assert the id of the execution too to ensure the right one is being deleted.","commit_id":"0da193535b072b106eb8effabf91ce0852c29195"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"5e6a57e4eface183dfb0dd5ca6cf23fd873fcdec","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        execs \u003d db_api.get_expired_executions(now)"},{"line_number":196,"context_line":"        self.assertEqual(0, len(execs))"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        _set_expiration_policy_config("},{"line_number":199,"context_line":"            evaluation_interval\u003d1,"},{"line_number":200,"context_line":"            older_than\u003d30,"},{"line_number":201,"context_line":"            ignored_states\u003d[\u0027RUNNING\u0027]"},{"line_number":202,"context_line":"        )"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        self.assertRaises(ValueError, expiration_policy.setup)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def test_deletion_of_expired_executions_with_batch_size_scenario1(self):"},{"line_number":207,"context_line":"        \"\"\"scenario1"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_c179c5c5","line":204,"range":{"start_line":198,"start_character":8,"end_line":204,"end_character":62},"updated":"2019-11-06 05:58:36.000000000","message":"please move this into its own test method","commit_id":"0da193535b072b106eb8effabf91ce0852c29195"}],"mistral/workflow/states.py":[{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"f159a82663e957c794679e9705f7dcc9b0c471bf","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    ERROR: [RUNNING]"},{"line_number":67,"context_line":"}"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"TERMINAL_STATES \u003d {SUCCESS,"},{"line_number":70,"context_line":"                   ERROR,"},{"line_number":71,"context_line":"                   CANCELLED,"},{"line_number":72,"context_line":"                   }"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def is_valid(state):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_9a522468","line":72,"range":{"start_line":69,"start_character":18,"end_line":72,"end_character":20},"updated":"2019-11-11 13:49:01.000000000","message":"this formatting is a little weird. The values would probably fit in a single line too. Like above.","commit_id":"8cad85f66b1d0a27e274810c32951a10120e5592"},{"author":{"_account_id":29124,"name":"Oleg Ovcharuk","email":"vgvoleg@gmail.com","username":"vgvoleg"},"change_message_id":"8338099e0fc283f65aa227212768c995bf62bc9e","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    ERROR: [RUNNING]"},{"line_number":67,"context_line":"}"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"TERMINAL_STATES \u003d {SUCCESS, ERROR, CANCELLED}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def is_valid(state):"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_75ddf23f","line":69,"updated":"2019-11-12 07:30:01.000000000","message":"Why don’t you use is_completed function? I feel bad when I see ERROR and TERMINAL in one expression","commit_id":"6b862e625e0b59cb7d3806a119fdd223227c06c2"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"73fa0915ab6c047df2cb061dd4e98eb68629ae72","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    ERROR: [RUNNING]"},{"line_number":67,"context_line":"}"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"TERMINAL_STATES \u003d {SUCCESS, ERROR, CANCELLED}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def is_valid(state):"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_358d3a35","line":69,"in_reply_to":"3fa7e38b_75ddf23f","updated":"2019-11-12 07:38:48.000000000","message":"1. We can\u0027t use this function to format the help string in config.py\n2. Oleg, I know you feel bad about it. We have disagreement about it. Let\u0027s please not block patches because of it.\n3. It seems like we\u0027re asking different conflicting things from Ali and, in general, too much from this particular commit, which is pretty trivial.\n\n:)","commit_id":"6b862e625e0b59cb7d3806a119fdd223227c06c2"}]}
