)]}'
{"taskflow/engines/action_engine/completer.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"1c2b0009ce54315a8ddbcbcf8ec3596212ed190b","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                # behave as a user would expect, i.e. if the retry gets"},{"line_number":187,"context_line":"                # exhausted it reverts the outer flow unless the outer flow"},{"line_number":188,"context_line":"                # has a separate retry behavior."},{"line_number":189,"context_line":"                if self._runtime.options.get(\u0027defer_reverts\u0027, False):"},{"line_number":190,"context_line":"                    return parent_resolver"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"                # Ok if the parent resolver says something not REVERT, and"}],"source_content_type":"text/x-python","patch_set":2,"id":"da85f559_c121054f","line":189,"updated":"2015-11-09 21:20:07.000000000","message":"Can u use https://github.com/openstack/oslo.utils/blob/master/oslo_utils/strutils.py#L109 that makes it inline with https://github.com/openstack/taskflow/blob/master/taskflow/engines/action_engine/engine.py#L241 so that both work in the same way (allowing boolean strings, not just boolean values).","commit_id":"ecae7dfaac7281fc20f74925157c0427f7b37644"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"28446bcc6242aa13d91fc2cb18e87b8d286b1c9b","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                # behave as a user would expect, i.e. if the retry gets"},{"line_number":188,"context_line":"                # exhausted it reverts the outer flow unless the outer flow"},{"line_number":189,"context_line":"                # has a separate retry behavior."},{"line_number":190,"context_line":"                defer_reverts \u003d strutils.bool_from_string("},{"line_number":191,"context_line":"                    self._runtime.options.get(\u0027defer_reverts\u0027, False)"},{"line_number":192,"context_line":"                )"},{"line_number":193,"context_line":"                if defer_reverts:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_36592b5b","line":190,"updated":"2015-11-10 05:14:12.000000000","message":"Other suggestion, just do this in the __init__ method, but not a big deal if its not IMHO.","commit_id":"2412219ff2b724c722637f5862586a3a35a60e89"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"7b43b2142048f37c675110a234ce82614fe49bd7","unresolved":false,"context_lines":[{"line_number":180,"context_line":"                # Ask parent retry and figure out what to do..."},{"line_number":181,"context_line":"                parent_resolver \u003d self._determine_resolution(retry, failure)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"                # In the future, this will be the only behavior.  REVERT"},{"line_number":184,"context_line":"                # should defer to the parent retry if it exists, or use the"},{"line_number":185,"context_line":"                # default REVERT_ALL if it doesn\u0027t.  This lets you safely nest"},{"line_number":186,"context_line":"                # flows with retries inside flows without retries and it still"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_b398601d","line":183,"updated":"2015-11-12 00:06:06.000000000","message":"nit: there\u0027s two spaces after the period, I think one is enough :)","commit_id":"256696e536eeae44e6a99a41e53cb1ab1ecd7638"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"7b43b2142048f37c675110a234ce82614fe49bd7","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"                # In the future, this will be the only behavior.  REVERT"},{"line_number":184,"context_line":"                # should defer to the parent retry if it exists, or use the"},{"line_number":185,"context_line":"                # default REVERT_ALL if it doesn\u0027t.  This lets you safely nest"},{"line_number":186,"context_line":"                # flows with retries inside flows without retries and it still"},{"line_number":187,"context_line":"                # behave as a user would expect, i.e. if the retry gets"},{"line_number":188,"context_line":"                # exhausted it reverts the outer flow unless the outer flow"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_d39ba416","line":185,"updated":"2015-11-12 00:06:06.000000000","message":"ditto","commit_id":"256696e536eeae44e6a99a41e53cb1ab1ecd7638"}],"taskflow/engines/action_engine/runtime.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"4aaa506cc8df13e3043c8dc4be9cc607d4ed07fc","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self._storage \u003d storage"},{"line_number":49,"context_line":"        self._compilation \u003d compilation"},{"line_number":50,"context_line":"        self._atom_cache \u003d {}"},{"line_number":51,"context_line":"        if options is not None:"},{"line_number":52,"context_line":"            self._options \u003d options"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            self._options \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_0ba96cdf","line":51,"updated":"2015-11-09 20:34:57.000000000","message":"I think u can avoid this due to:\n\nhttps://github.com/openstack/taskflow/blob/master/taskflow/engines/base.py#L44\n\nSo that should always be a empty dict, due to ^ above check.","commit_id":"d005e5019960dc227e84e38c040f21285e3f4d2a"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"cf74a4d172162927f48d83a6cd724e02eb558e2e","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self._storage \u003d storage"},{"line_number":49,"context_line":"        self._compilation \u003d compilation"},{"line_number":50,"context_line":"        self._atom_cache \u003d {}"},{"line_number":51,"context_line":"        if options is not None:"},{"line_number":52,"context_line":"            self._options \u003d options"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            self._options \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_eb99886f","line":51,"in_reply_to":"da85f559_0ba96cdf","updated":"2015-11-09 20:41:43.000000000","message":"Yeah, for the current code path that works, but this makes it safe from new code paths that create Runtime objects and might not pass in any options.","commit_id":"d005e5019960dc227e84e38c040f21285e3f4d2a"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"eda5ab69258698635e6312aac758dc5403c5c59a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self._storage \u003d storage"},{"line_number":49,"context_line":"        self._compilation \u003d compilation"},{"line_number":50,"context_line":"        self._atom_cache \u003d {}"},{"line_number":51,"context_line":"        if options is not None:"},{"line_number":52,"context_line":"            self._options \u003d options"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            self._options \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_8b1c7cc2","line":51,"in_reply_to":"da85f559_eb99886f","updated":"2015-11-09 20:45:30.000000000","message":"Ok, perhaps then use a similar piece of code then?\n\nPerhaps add the following to utils/misc.py\n\n    \u003e\u003e\u003e def ensure_dict(dct\u003dNone):\n    ...    if not dct:\n    ...       return {}\n    ...    else:\n    ...       return dict(dct)\n    ... \n\nThen use it from both of these locations?","commit_id":"d005e5019960dc227e84e38c040f21285e3f4d2a"}],"taskflow/tests/unit/test_retries.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"1b819e253af46bdeaf796eddf928afb534f09504","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    \u0027r1.r REVERTING\u0027,"},{"line_number":134,"context_line":"                    \u0027r1.r REVERTED(None)\u0027,"},{"line_number":135,"context_line":"                    \u0027flow-1.f REVERTED\u0027]"},{"line_number":136,"context_line":"        self.assertEqual(capturer.values, expected)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_states_retry_failure_linear_flow(self):"},{"line_number":139,"context_line":"        flow \u003d lf.Flow(\u0027flow-1\u0027, retry.Times(2, \u0027r1\u0027, provides\u003d\u0027x\u0027)).add("}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_5e1e1460","line":136,"updated":"2015-11-10 22:27:58.000000000","message":"assertEqual should be (expected, actual), please revert back :)\n\nsimilar to:\nhttps://review.openstack.org/#/c/236197/1/taskflow/tests/unit/patterns/test_graph_flow.py","commit_id":"2412219ff2b724c722637f5862586a3a35a60e89"},{"author":{"_account_id":10584,"name":"Min Pae","username":"sputnik13","inactive":true},"change_message_id":"d82652b6f180b41ec02f8fd49e8e653f8851c538","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    \u0027r1.r REVERTING\u0027,"},{"line_number":134,"context_line":"                    \u0027r1.r REVERTED(None)\u0027,"},{"line_number":135,"context_line":"                    \u0027flow-1.f REVERTED\u0027]"},{"line_number":136,"context_line":"        self.assertEqual(capturer.values, expected)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_states_retry_failure_linear_flow(self):"},{"line_number":139,"context_line":"        flow \u003d lf.Flow(\u0027flow-1\u0027, retry.Times(2, \u0027r1\u0027, provides\u003d\u0027x\u0027)).add("}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_de8e8478","line":136,"in_reply_to":"da85f559_5e1e1460","updated":"2015-11-10 22:32:18.000000000","message":"http://testtools.readthedocs.org/en/latest/api.html#testtools.TestCase.assertEqual","commit_id":"2412219ff2b724c722637f5862586a3a35a60e89"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"453a7a65c6c711cf6c1d9c8054f5176cf6e0ddae","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    \u0027r1.r REVERTING\u0027,"},{"line_number":134,"context_line":"                    \u0027r1.r REVERTED(None)\u0027,"},{"line_number":135,"context_line":"                    \u0027flow-1.f REVERTED\u0027]"},{"line_number":136,"context_line":"        self.assertEqual(capturer.values, expected)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_states_retry_failure_linear_flow(self):"},{"line_number":139,"context_line":"        flow \u003d lf.Flow(\u0027flow-1\u0027, retry.Times(2, \u0027r1\u0027, provides\u003d\u0027x\u0027)).add("}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_0fe05428","line":136,"in_reply_to":"da85f559_5ea9348f","updated":"2015-11-11 00:31:02.000000000","message":"The output on test failure does not match the documentation then.  If there is not a match it states that the first value is the actual and the second is the expected.","commit_id":"2412219ff2b724c722637f5862586a3a35a60e89"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"68c9726f5ed628782251c25c560078d757ced9fe","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                    \u0027r1.r REVERTING\u0027,"},{"line_number":134,"context_line":"                    \u0027r1.r REVERTED(None)\u0027,"},{"line_number":135,"context_line":"                    \u0027flow-1.f REVERTED\u0027]"},{"line_number":136,"context_line":"        self.assertEqual(capturer.values, expected)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_states_retry_failure_linear_flow(self):"},{"line_number":139,"context_line":"        flow \u003d lf.Flow(\u0027flow-1\u0027, retry.Times(2, \u0027r1\u0027, provides\u003d\u0027x\u0027)).add("}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_5ea9348f","line":136,"in_reply_to":"da85f559_de8e8478","updated":"2015-11-10 22:40:05.000000000","message":"thanks for adding the link, I forgot to add that for context :)","commit_id":"2412219ff2b724c722637f5862586a3a35a60e89"}],"taskflow/utils/misc.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"7b43b2142048f37c675110a234ce82614fe49bd7","unresolved":false,"context_lines":[{"line_number":583,"context_line":"            isinstance(obj, collections.Iterable))"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"def ensure_dict(obj):"},{"line_number":587,"context_line":"    \"\"\"Copy an existing dictionary or default to empty dict....\"\"\""},{"line_number":588,"context_line":"    if not obj:"},{"line_number":589,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_2e172349","line":586,"updated":"2015-11-12 00:06:06.000000000","message":"add tests for the new util to:  tests/unit/test_utils.py","commit_id":"256696e536eeae44e6a99a41e53cb1ab1ecd7638"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"049d1ff3f3210d220aadfadb4499835ad0c13d02","unresolved":false,"context_lines":[{"line_number":583,"context_line":"            isinstance(obj, collections.Iterable))"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"def ensure_dict(obj):"},{"line_number":587,"context_line":"    \"\"\"Copy an existing dictionary or default to empty dict....\"\"\""},{"line_number":588,"context_line":"    if not obj:"},{"line_number":589,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_af2ba332","line":586,"in_reply_to":"da85f559_2e172349","updated":"2015-11-13 17:06:26.000000000","message":"ah, good idea, doesn\u0027t hurt i guess","commit_id":"256696e536eeae44e6a99a41e53cb1ab1ecd7638"}]}
