)]}'
{"taskflow/atom.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"f41a0ca7153fca7261b6404a8598fbef9f0d3cc1","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            if arg in task_args:"},{"line_number":90,"context_line":"                task_args.remove(arg)"},{"line_number":91,"context_line":"    if inject:"},{"line_number":92,"context_line":"        for arg in inject:"},{"line_number":93,"context_line":"            task_args.append(arg)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    result \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_536d9803","line":92,"updated":"2014-05-22 23:42:56.000000000","message":"I think inject will be a dictionary right, just to make that more obvious can u use six.iterkeys() instead, it seems to be used as a dictionary below self.inject.keys() so making that clear would be great (at least to me).","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"545213a9bc477a0e553d5b55d59c1c098036047f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            if arg in task_args:"},{"line_number":90,"context_line":"                task_args.remove(arg)"},{"line_number":91,"context_line":"    if inject:"},{"line_number":92,"context_line":"        for arg in inject:"},{"line_number":93,"context_line":"            task_args.append(arg)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    result \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_6e5e1b78","line":92,"in_reply_to":"7adec928_536d9803","updated":"2014-05-23 12:09:28.000000000","message":"I\u0027m a python newb, so I have no idea what six.iterkeys is, so I\u0027ll have to go google that and see if it makes sense to use here.  I actually added this code to help deal with the required args stuff, but that code ended up being somewhere else, so I might just be able to remove this part.  I\u0027ll test that out.","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"b35fd16c43acef9005a1576722af7645e1ca5838","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            if arg in task_args:"},{"line_number":90,"context_line":"                task_args.remove(arg)"},{"line_number":91,"context_line":"    if inject:"},{"line_number":92,"context_line":"        for arg in inject:"},{"line_number":93,"context_line":"            task_args.append(arg)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    result \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_dae9a61b","line":92,"in_reply_to":"7adec928_6e5e1b78","updated":"2014-05-23 15:49:16.000000000","message":"Six is a python2/3 compatilbilty layer.\n\nKeys() was one of the functions that changed meaning between 2/3; so explicility using iterkeys() will make it obvious what is being used here (and six will handle the differences between 2/3).\n\nhttps://pypi.python.org/pypi/six","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"f41a0ca7153fca7261b6404a8598fbef9f0d3cc1","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    if inject:"},{"line_number":92,"context_line":"        for arg in inject:"},{"line_number":93,"context_line":"            task_args.append(arg)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    result \u003d {}"},{"line_number":96,"context_line":"    if reqs:"},{"line_number":97,"context_line":"        result.update((a, a) for a in reqs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_9e12c756","line":94,"updated":"2014-05-22 23:42:56.000000000","message":"A followup question, are injected args affected by the rebinding that occurs. For example if i inject a, b, c, but the rebinding says a \u003d\u003e x, b \u003d\u003e y, c \u003d\u003e z then what is injected would not match what will be called and the execute() function call would likely fail. Just might be something to check/test for (since it seems like injected keys \u0026 values would be affected by the same rebinding mechanism).","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c1cd1de46691b7fcd37e354e6bdc49a876b2b70b","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    if inject:"},{"line_number":92,"context_line":"        for arg in inject:"},{"line_number":93,"context_line":"            task_args.append(arg)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    result \u003d {}"},{"line_number":96,"context_line":"    if reqs:"},{"line_number":97,"context_line":"        result.update((a, a) for a in reqs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_ba5dba17","line":94,"in_reply_to":"7adec928_8e260715","updated":"2014-05-23 15:46:50.000000000","message":"I\u0027m fine with it happening before. Seems if someone really wants to do this then they should be able to :-)","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"545213a9bc477a0e553d5b55d59c1c098036047f","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    if inject:"},{"line_number":92,"context_line":"        for arg in inject:"},{"line_number":93,"context_line":"            task_args.append(arg)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    result \u003d {}"},{"line_number":96,"context_line":"    if reqs:"},{"line_number":97,"context_line":"        result.update((a, a) for a in reqs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_8e260715","line":94,"in_reply_to":"7adec928_9e12c756","updated":"2014-05-23 12:09:28.000000000","message":"The injection happens before the rebind.  I can\u0027t imagine anyone would purposely inject a parameter and then rebind it.  Should I make it happen after so it\u0027s not possible?","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"f41a0ca7153fca7261b6404a8598fbef9f0d3cc1","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        \"\"\"Any inputs this atom requires to execute.\"\"\""},{"line_number":171,"context_line":"        requires \u003d set(self.rebind.values())"},{"line_number":172,"context_line":"        if self.inject:"},{"line_number":173,"context_line":"            requires \u003d requires - set(self.inject.keys())"},{"line_number":174,"context_line":"        return requires"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_33348cfa","line":173,"updated":"2014-05-22 23:42:56.000000000","message":"Can u use six.iterkeys as I believe u are intending self.inject to be a dictionary?","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"df328753fb1b33156605b97ab2543e548bdfd6d2","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def _build_arg_mapping(task_name, reqs, rebind_args, function, do_infer,"},{"line_number":80,"context_line":"                       ignore_list\u003dNone, inject\u003dNone):"},{"line_number":81,"context_line":"    \"\"\"Given a function, its requirements and a rebind mapping this helper"},{"line_number":82,"context_line":"    function will build the correct argument mapping for the given function as"},{"line_number":83,"context_line":"    well as verify that the final argument mapping does not have missing or"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_7d69ac8a","line":80,"updated":"2014-05-28 00:48:00.000000000","message":"Is this still needed; doesn\u0027t appear to be used?","commit_id":"b4b65a6ba4176ba9ff50c41163213ebfffa5a9b3"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"135a620a0517d5fb038f4acf7056588fa3426da6","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def _build_arg_mapping(task_name, reqs, rebind_args, function, do_infer,"},{"line_number":80,"context_line":"                       ignore_list\u003dNone, inject\u003dNone):"},{"line_number":81,"context_line":"    \"\"\"Given a function, its requirements and a rebind mapping this helper"},{"line_number":82,"context_line":"    function will build the correct argument mapping for the given function as"},{"line_number":83,"context_line":"    well as verify that the final argument mapping does not have missing or"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_40f5e781","line":80,"in_reply_to":"3ae8d1ca_7d69ac8a","updated":"2014-05-28 02:04:25.000000000","message":"Done","commit_id":"b4b65a6ba4176ba9ff50c41163213ebfffa5a9b3"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d55abf0a4f331853a927faf192a0474803107e70","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.inject \u003d inject"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def _build_arg_mapping(self, executor, requires\u003dNone, rebind\u003dNone,"},{"line_number":146,"context_line":"                           auto_extract\u003dTrue, ignore_list\u003dNone,"},{"line_number":147,"context_line":"                           inject\u003dNone):"},{"line_number":148,"context_line":"        self.rebind \u003d _build_arg_mapping(self.name, requires, rebind,"},{"line_number":149,"context_line":"                                         executor, auto_extract, ignore_list)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_6093c3fa","line":146,"updated":"2014-05-28 02:12:23.000000000","message":"Is this one still used? Should it be used?","commit_id":"8f04dc5dca4be104c597a574c8b10d49e29120e3"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"bc5ddc2c619b7d18d79134e1cf3adc530addb87e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.inject \u003d inject"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def _build_arg_mapping(self, executor, requires\u003dNone, rebind\u003dNone,"},{"line_number":146,"context_line":"                           auto_extract\u003dTrue, ignore_list\u003dNone,"},{"line_number":147,"context_line":"                           inject\u003dNone):"},{"line_number":148,"context_line":"        self.rebind \u003d _build_arg_mapping(self.name, requires, rebind,"},{"line_number":149,"context_line":"                                         executor, auto_extract, ignore_list)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ae8d1ca_7a0999dc","line":146,"in_reply_to":"3ae8d1ca_6093c3fa","updated":"2014-05-28 14:31:56.000000000","message":"D\u0027oh, missed it.","commit_id":"8f04dc5dca4be104c597a574c8b10d49e29120e3"}],"taskflow/engines/action_engine/task_action.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"f41a0ca7153fca7261b6404a8598fbef9f0d3cc1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            raise exceptions.InvalidState(\"Task %s is in invalid state and\""},{"line_number":67,"context_line":"                                          \" can\u0027t be executed\" % task.name)"},{"line_number":68,"context_line":"        if task.inject:"},{"line_number":69,"context_line":"            self._storage.inject(task.inject, transient\u003dTrue)"},{"line_number":70,"context_line":"        kwargs \u003d self._storage.fetch_mapped_args(task.rebind)"},{"line_number":71,"context_line":"        task_uuid \u003d self._storage.get_atom_uuid(task.name)"},{"line_number":72,"context_line":"        return self._task_executor.execute_task(task, task_uuid, kwargs,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_930ba02a","line":69,"updated":"2014-05-22 23:42:56.000000000","message":"This is almost right, this will expose the injected values to all tasks in the storage, when I think u only want to expose it to the task itself right (since its a task local injection)? If so then the inject method still needs to know the task name as an optional target of the injection.\n\nSomething like would seem appropriate:\n\n  self._storage.inject(task.inject, target\u003dtask.name, transient\u003dTrue)\n\nI\u0027m also thinking that instead of doing this at scheduling time that the above injection would be done at prepare time in this method @ https://github.com/openstack/taskflow/blob/master/taskflow/engines/action_engine/engine.py#L164 (the _ensure_storage_for method), that way seems more appropriate instead of doing it really late in the process at scheduling/execution time.","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"545213a9bc477a0e553d5b55d59c1c098036047f","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            raise exceptions.InvalidState(\"Task %s is in invalid state and\""},{"line_number":67,"context_line":"                                          \" can\u0027t be executed\" % task.name)"},{"line_number":68,"context_line":"        if task.inject:"},{"line_number":69,"context_line":"            self._storage.inject(task.inject, transient\u003dTrue)"},{"line_number":70,"context_line":"        kwargs \u003d self._storage.fetch_mapped_args(task.rebind)"},{"line_number":71,"context_line":"        task_uuid \u003d self._storage.get_atom_uuid(task.name)"},{"line_number":72,"context_line":"        return self._task_executor.execute_task(task, task_uuid, kwargs,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_8edb67ec","line":69,"in_reply_to":"7adec928_930ba02a","updated":"2014-05-23 12:09:28.000000000","message":"Ok, I\u0027ll check it out.  Due to my relative unfamiliarity with the code, I just found where the rebinding occurred and chose that as the spot to add my bits.","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"}],"taskflow/storage.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"df328753fb1b33156605b97ab2543e548bdfd6d2","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self._flowdetail \u003d flow_detail"},{"line_number":53,"context_line":"        self._lock \u003d self._lock_cls()"},{"line_number":54,"context_line":"        self._transients \u003d {}"},{"line_number":55,"context_line":"        self._old_transients \u003d None"},{"line_number":56,"context_line":"        self._injected_args \u003d {}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        # NOTE(imelnikov): failure serialization looses information,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_dd0f20e0","line":55,"updated":"2014-05-28 00:48:00.000000000","message":"Is this still used?","commit_id":"b4b65a6ba4176ba9ff50c41163213ebfffa5a9b3"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"135a620a0517d5fb038f4acf7056588fa3426da6","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self._flowdetail \u003d flow_detail"},{"line_number":53,"context_line":"        self._lock \u003d self._lock_cls()"},{"line_number":54,"context_line":"        self._transients \u003d {}"},{"line_number":55,"context_line":"        self._old_transients \u003d None"},{"line_number":56,"context_line":"        self._injected_args \u003d {}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        # NOTE(imelnikov): failure serialization looses information,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_e0351347","line":55,"in_reply_to":"3ae8d1ca_dd0f20e0","updated":"2014-05-28 02:04:25.000000000","message":"Done","commit_id":"b4b65a6ba4176ba9ff50c41163213ebfffa5a9b3"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"df328753fb1b33156605b97ab2543e548bdfd6d2","unresolved":false,"context_lines":[{"line_number":530,"context_line":"                injected_args \u003d self._injected_args.get(task_name, {})"},{"line_number":531,"context_line":"            mapped_args \u003d {}"},{"line_number":532,"context_line":"            for key, name in six.iteritems(args_mapping):"},{"line_number":533,"context_line":"                value \u003d injected_args.get(name)"},{"line_number":534,"context_line":"                if value is None:"},{"line_number":535,"context_line":"                    value \u003d self.fetch(name)"},{"line_number":536,"context_line":"                mapped_args[key] \u003d value"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_7d00ccaa","line":533,"updated":"2014-05-28 00:48:00.000000000","message":"How about \u0027name in injected_args\u0027; that way None can be a valid injected value (with this method None is disallowed).","commit_id":"b4b65a6ba4176ba9ff50c41163213ebfffa5a9b3"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"135a620a0517d5fb038f4acf7056588fa3426da6","unresolved":false,"context_lines":[{"line_number":530,"context_line":"                injected_args \u003d self._injected_args.get(task_name, {})"},{"line_number":531,"context_line":"            mapped_args \u003d {}"},{"line_number":532,"context_line":"            for key, name in six.iteritems(args_mapping):"},{"line_number":533,"context_line":"                value \u003d injected_args.get(name)"},{"line_number":534,"context_line":"                if value is None:"},{"line_number":535,"context_line":"                    value \u003d self.fetch(name)"},{"line_number":536,"context_line":"                mapped_args[key] \u003d value"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_604903d0","line":533,"in_reply_to":"3ae8d1ca_7d00ccaa","updated":"2014-05-28 02:04:25.000000000","message":"Done","commit_id":"b4b65a6ba4176ba9ff50c41163213ebfffa5a9b3"}],"taskflow/tests/unit/test_arguments_passing.py":[{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"f41a0ca7153fca7261b6404a8598fbef9f0d3cc1","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            \u0027result\u0027: 30,"},{"line_number":91,"context_line":"        })"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test_argument_injection(self):"},{"line_number":94,"context_line":"        flow \u003d utils.TaskMultiArgOneReturn(provides\u003d\u0027result\u0027,"},{"line_number":95,"context_line":"                                           inject\u003d{\u0027x\u0027: 1, \u0027y\u0027: 4, \u0027z\u0027: 9})"},{"line_number":96,"context_line":"        engine \u003d self._make_engine(flow)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_5e575f02","line":93,"updated":"2014-05-22 23:42:56.000000000","message":"Cool, be nice to have a test that also mixes injection + rebinding (just to make sure the effects of both work well together). Also same kind of question for what happens if a task declares it needs something that is satisfied by its injected values (and so on).","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"},{"author":{"_account_id":9648,"name":"Greg Hill","email":"greg.hill@rackspace.com","username":"jimbobhickville"},"change_message_id":"545213a9bc477a0e553d5b55d59c1c098036047f","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            \u0027result\u0027: 30,"},{"line_number":91,"context_line":"        })"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test_argument_injection(self):"},{"line_number":94,"context_line":"        flow \u003d utils.TaskMultiArgOneReturn(provides\u003d\u0027result\u0027,"},{"line_number":95,"context_line":"                                           inject\u003d{\u0027x\u0027: 1, \u0027y\u0027: 4, \u0027z\u0027: 9})"},{"line_number":96,"context_line":"        engine \u003d self._make_engine(flow)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7adec928_6eec5b90","line":93,"in_reply_to":"7adec928_5e575f02","updated":"2014-05-23 12:09:28.000000000","message":"Good points.  I\u0027ll add those test cases.","commit_id":"9fd90592ba125554f059fb958bd3d55e471d5fa1"}]}
