)]}'
{"vitrage/evaluator/actions/recipes/execute_mistral.py":[{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"9ca634c8e43b3b2256e993471ddf0d4a44bf98f3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    @staticmethod"},{"line_number":39,"context_line":"    def get_do_recipe(action_spec):"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        execute_external_step \u003d ExecuteMistral._get_execute_external_step("},{"line_number":42,"context_line":"            action_spec.properties"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_b4bbd50c","line":41,"range":{"start_line":41,"start_character":32,"end_line":41,"end_character":46},"updated":"2017-06-29 10:45:10.000000000","message":"you can use self here even though its static","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"8c28d75844347771fdbea21f17143e807d1817d6","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    @staticmethod"},{"line_number":39,"context_line":"    def get_do_recipe(action_spec):"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        execute_external_step \u003d ExecuteMistral._get_execute_external_step("},{"line_number":42,"context_line":"            action_spec.properties"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_b4a75550","line":41,"range":{"start_line":41,"start_character":32,"end_line":41,"end_character":46},"in_reply_to":"3f1d235d_b4bbd50c","updated":"2017-06-29 10:59:04.000000000","message":"Ok, I\u0027ll change it. Maybe move the entire step creation here.","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"9ca634c8e43b3b2256e993471ddf0d4a44bf98f3","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            action_spec.properties"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        return [execute_external_step]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def get_undo_recipe(action_spec):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_144a8926","line":45,"range":{"start_line":45,"start_character":15,"end_line":45,"end_character":38},"updated":"2017-06-29 10:45:10.000000000","message":"do u have to return a list ? can\u0027t it be a tuple","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"8c28d75844347771fdbea21f17143e807d1817d6","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            action_spec.properties"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        return [execute_external_step]"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @staticmethod"},{"line_number":48,"context_line":"    def get_undo_recipe(action_spec):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_147609da","line":45,"range":{"start_line":45,"start_character":15,"end_line":45,"end_character":38},"in_reply_to":"3f1d235d_144a8926","updated":"2017-06-29 10:59:04.000000000","message":"That\u0027s what all the other recipes do...","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"9ca634c8e43b3b2256e993471ddf0d4a44bf98f3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def _get_execute_external_step(properties):"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        properties[EXECUTION_ENGINE] \u003d MISTRAL"},{"line_number":56,"context_line":"        execute_external_step \u003d ActionStepWrapper(EXECUTE_EXTERNAL,"},{"line_number":57,"context_line":"                                                  properties)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        return execute_external_step"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_74641dba","line":59,"range":{"start_line":56,"start_character":7,"end_line":59,"end_character":36},"updated":"2017-06-29 10:45:10.000000000","message":"you can inline there statments","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"8c28d75844347771fdbea21f17143e807d1817d6","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def _get_execute_external_step(properties):"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        properties[EXECUTION_ENGINE] \u003d MISTRAL"},{"line_number":56,"context_line":"        execute_external_step \u003d ActionStepWrapper(EXECUTE_EXTERNAL,"},{"line_number":57,"context_line":"                                                  properties)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        return execute_external_step"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_f4726de3","line":59,"range":{"start_line":56,"start_character":7,"end_line":59,"end_character":36},"in_reply_to":"3f1d235d_74641dba","updated":"2017-06-29 10:59:04.000000000","message":"Ok","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"}],"vitrage/evaluator/template_validation/content/execute_mistral_validator.py":[{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"9ca634c8e43b3b2256e993471ddf0d4a44bf98f3","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        properties \u003d action[TemplateFields.PROPERTIES]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        if WORKFLOW not in properties or not properties[WORKFLOW]:"},{"line_number":38,"context_line":"            LOG.error(\u0027%s status code: %s\u0027 % (status_msgs[133], 133))"},{"line_number":39,"context_line":"            return get_content_fault_result(133)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        return get_content_correct_result()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_b4fe35ac","line":39,"range":{"start_line":38,"start_character":58,"end_line":39,"end_character":48},"updated":"2017-06-29 10:45:10.000000000","message":"no constants for 133 ?","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"8c28d75844347771fdbea21f17143e807d1817d6","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        properties \u003d action[TemplateFields.PROPERTIES]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        if WORKFLOW not in properties or not properties[WORKFLOW]:"},{"line_number":38,"context_line":"            LOG.error(\u0027%s status code: %s\u0027 % (status_msgs[133], 133))"},{"line_number":39,"context_line":"            return get_content_fault_result(133)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        return get_content_correct_result()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_b4551520","line":39,"range":{"start_line":38,"start_character":58,"end_line":39,"end_character":48},"in_reply_to":"3f1d235d_b4fe35ac","updated":"2017-06-29 10:59:04.000000000","message":"The same code is written everywhere in the validators... we could refactor that, but I rather not do it in this change","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"}],"vitrage/tests/base.py":[{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"65591f72034141c535a6a0c39ec39a4255f9f118","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    Usage:"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    from testtools.matchers import HasLength"},{"line_number":29,"context_line":"    self.assertThat(action_steps, IsEmpty)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    \"\"\""},{"line_number":32,"context_line":"    def __call__(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_efbbb30b","line":29,"range":{"start_line":29,"start_character":34,"end_line":29,"end_character":41},"updated":"2017-06-29 14:54:45.000000000","message":"This comment is different from the actual usage in test_execute_mistral.py","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"2368a5d297e4cb0d89493854ab8cdd4d0676d196","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    Usage:"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    from testtools.matchers import HasLength"},{"line_number":29,"context_line":"    self.assertThat(action_steps, IsEmpty)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    \"\"\""},{"line_number":32,"context_line":"    def __call__(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_92d429bf","line":29,"range":{"start_line":29,"start_character":34,"end_line":29,"end_character":41},"in_reply_to":"3f1d235d_efbbb30b","updated":"2017-07-02 06:29:46.000000000","message":"Done","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"65591f72034141c535a6a0c39ec39a4255f9f118","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        return HasLength(0)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"IsEmpty \u003d Empty()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseTest(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_2f9f6b51","line":36,"updated":"2017-06-29 14:54:45.000000000","message":"Is it equivalent to\n\nIsEmpty \u003d lambda : HasLength(0)","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"0cf6079f9577b4af7a3db68a3d6e73923b9a0d58","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        return HasLength(0)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"IsEmpty \u003d Empty()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseTest(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_9afe69ac","line":36,"in_reply_to":"3f1d235d_1a825950","updated":"2017-07-03 13:42:31.000000000","message":"I guess it is probably because HasLength(0) returns a callable method, so it will be executed in context like `x.HasLength(0)()`","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"c6435ab41184d9dedf1971367ab78a0963dbc181","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        return HasLength(0)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"IsEmpty \u003d Empty()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseTest(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_cf1357b8","line":36,"in_reply_to":"3f1d235d_2f9f6b51","updated":"2017-06-29 14:58:39.000000000","message":"Since it takes no argument, `IsEmpty \u003d HasLength(0)` may look better.","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"5427ee67d8ed7f0e9ca8a2c4bc1078b4ad68b3b7","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        return HasLength(0)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"IsEmpty \u003d Empty()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseTest(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_862a9a8d","line":36,"in_reply_to":"3f1d235d_6d13f25d","updated":"2017-07-03 11:58:25.000000000","message":"It seems for matchers like IsEmpty that takes no params, we may use the constructor MatchesPredicate http://testtools.readthedocs.io/en/latest/for-test-authors.html#matchespredicate\n\nSee https://review.openstack.org/#/c/479793/ for an alternative implementation.","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"d2db6e889a6500230ef2b042070c2ce12e33f3cb","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        return HasLength(0)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"IsEmpty \u003d Empty()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseTest(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_b4c6dc47","line":36,"in_reply_to":"3f1d235d_862a9a8d","updated":"2017-07-03 12:50:01.000000000","message":"I checked it again, and your first solution with lambda: HasLength(0) works. I think it is better, since it uses an already existing function instead of creating a new one.","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"0f513fceaf168405fa452fde7d21c5913a148878","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        return HasLength(0)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"IsEmpty \u003d Empty()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseTest(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_2da82c75","line":36,"in_reply_to":"3f1d235d_9afe69ac","updated":"2017-07-04 07:47:12.000000000","message":"Since both options work, do you have any objection to the current solution?","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"5d86f402fb67f6fa0d2a2450ae131c3418cc596d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        return HasLength(0)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"IsEmpty \u003d Empty()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseTest(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_1a825950","line":36,"in_reply_to":"3f1d235d_b4c6dc47","updated":"2017-07-03 13:38:31.000000000","message":"I checked again, the second solution also works... Tests passed locally. \n\nPatch updated in https://review.openstack.org/#/c/479793/\n\nJust be careful on when to use parentheses :-)","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"2368a5d297e4cb0d89493854ab8cdd4d0676d196","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        return HasLength(0)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"IsEmpty \u003d Empty()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class BaseTest(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_6d13f25d","line":36,"in_reply_to":"3f1d235d_cf1357b8","updated":"2017-07-02 06:29:46.000000000","message":"Your suggested solution doesn\u0027t work - I get a runtime error.\nHasLength is a matcher that when called - compares the length of the list to the wanted value. \nI don\u0027t think that writing IsEmpty \u003d HasLength(0) can work, since you cannot just execute HasLength(0) out of context.","commit_id":"bf430f9f0af4bc02aa5336c1c3219875753cb58b"}],"vitrage/tests/unit/evaluator/recipes/test_execute_mistral.py":[{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"9ca634c8e43b3b2256e993471ddf0d4a44bf98f3","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # Test Assertions"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        # expecting for one step: [execute_external]"},{"line_number":47,"context_line":"        self.assertEqual(1, len(action_steps))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertEqual(EXECUTE_EXTERNAL, action_steps[0].type)"},{"line_number":50,"context_line":"        execute_external_step_params \u003d action_steps[0].params"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_74e1bdd0","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":46},"updated":"2017-06-29 10:45:10.000000000","message":"maybe use this ?\n\nfrom testtools import matchers\n\nself.assertThat(action_steps, matchers.HasLength(1))","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"8c28d75844347771fdbea21f17143e807d1817d6","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # Test Assertions"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        # expecting for one step: [execute_external]"},{"line_number":47,"context_line":"        self.assertEqual(1, len(action_steps))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertEqual(EXECUTE_EXTERNAL, action_steps[0].type)"},{"line_number":50,"context_line":"        execute_external_step_params \u003d action_steps[0].params"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_b42ab58d","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":46},"in_reply_to":"3f1d235d_74e1bdd0","updated":"2017-06-29 10:59:04.000000000","message":"Are you sure that\u0027s nicer? to me it seems more complex and less clear","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"302d9c9cda7c77ca9decd6664d94b6d7d125983a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # Test Assertions"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        # expecting for one step: [execute_external]"},{"line_number":47,"context_line":"        self.assertEqual(1, len(action_steps))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertEqual(EXECUTE_EXTERNAL, action_steps[0].type)"},{"line_number":50,"context_line":"        execute_external_step_params \u003d action_steps[0].params"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_0f94b68a","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":46},"in_reply_to":"3f1d235d_b42ab58d","updated":"2017-06-29 11:07:27.000000000","message":"well a lot of projects use matchers\nsometimes its more readable\n\nyou can do this \n\nfrom testtools.matchers import HasLength\n\nand then\n\nself.assertThat(action_steps, HasLength(1))","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"9ca634c8e43b3b2256e993471ddf0d4a44bf98f3","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        # Test Assertions"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # expecting for zero steps (no undo for this action)"},{"line_number":68,"context_line":"        self.assertEqual(0, len(action_steps))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_b4d635f1","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":46},"updated":"2017-06-29 10:45:10.000000000","message":"same as above","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"},{"author":{"_account_id":19134,"name":"Eyal","email":"eyalb1@gmail.com","username":"eyalb"},"change_message_id":"302d9c9cda7c77ca9decd6664d94b6d7d125983a","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        # Test Assertions"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # expecting for zero steps (no undo for this action)"},{"line_number":68,"context_line":"        self.assertEqual(0, len(action_steps))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_2f69b2bd","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":46},"in_reply_to":"3f1d235d_b4d635f1","updated":"2017-06-29 11:07:27.000000000","message":"I would right a matcher IsEmpty (if there isn\u0027t one)\n\nwhich will make it more concise an readable\n\nself.assertThat(action_steps, IsEmpty())","commit_id":"5d822d9c2124b008991f8141d29f8a3d0d2dc0dd"}]}
