)]}'
{"mistral/workflow/graphing.py":[{"author":{"_account_id":19206,"name":"Dawid Deja","email":"dawdej@gmail.com","username":"ddeja"},"change_message_id":"d3bed3783da824a7e7e4070d43b7a11ba6555d12","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_task(self, task):"},{"line_number":55,"context_line":"        if not self.has_task(task):"},{"line_number":56,"context_line":"            raise Exception(\u0027Task does not exist.\u0027)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return copy.deepcopy(self._graph.node[task])"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_1a713d78","line":56,"range":{"start_line":56,"start_character":18,"end_line":56,"end_character":27},"updated":"2016-10-17 14:13:15.000000000","message":"Can we use more specific exception? It will be easier for catching.","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"},{"author":{"_account_id":19206,"name":"Dawid Deja","email":"dawdej@gmail.com","username":"ddeja"},"change_message_id":"d3bed3783da824a7e7e4070d43b7a11ba6555d12","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        return nx.get_node_attributes(self._graph, attribute)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def add_task(self, task, **kwargs):"},{"line_number":64,"context_line":"        if not self.has_task(task):"},{"line_number":65,"context_line":"            self._graph.add_node(task, **kwargs)"},{"line_number":66,"context_line":"        else:"},{"line_number":67,"context_line":"            self.update_task(task, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_5a19f521","line":64,"range":{"start_line":64,"start_character":8,"end_line":64,"end_character":34},"updated":"2016-10-17 14:13:15.000000000","message":"How \u0027task\u0027 should be understood in this context? Is it TaskSpec, TaskExecution or something else?","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"},{"author":{"_account_id":5558,"name":"Winson Chan","email":"wcchan@stackstorm.com","username":"winson-c-chan"},"change_message_id":"6918cbe7b3de7fe6e6775c22026fa22bdc2013d9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        return nx.get_node_attributes(self._graph, attribute)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def add_task(self, task, **kwargs):"},{"line_number":64,"context_line":"        if not self.has_task(task):"},{"line_number":65,"context_line":"            self._graph.add_node(task, **kwargs)"},{"line_number":66,"context_line":"        else:"},{"line_number":67,"context_line":"            self.update_task(task, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_1af100ce","line":64,"range":{"start_line":64,"start_character":8,"end_line":64,"end_character":34},"in_reply_to":"fa6399be_5a19f521","updated":"2016-10-18 18:18:42.000000000","message":"Let\u0027s look at the context. The class here is a graph and contains nodes that represents tasks.  These are not spec or execution objects. They are just a node in this workflow graph that is used to tell us there is a task and how it transitions to other tasks. If we understand this context, I don\u0027t think we need to specific whether this is a spec or execution.","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"},{"author":{"_account_id":19206,"name":"Dawid Deja","email":"dawdej@gmail.com","username":"ddeja"},"change_message_id":"d3bed3783da824a7e7e4070d43b7a11ba6555d12","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def update_task(self, task, **kwargs):"},{"line_number":70,"context_line":"        if not self.has_task(task):"},{"line_number":71,"context_line":"            raise Exception(\u0027Task does not exist.\u0027)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        for key, value in six.iteritems(kwargs):"},{"line_number":74,"context_line":"            self._graph.node[task][key] \u003d value"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_daa98592","line":71,"range":{"start_line":71,"start_character":12,"end_line":71,"end_character":51},"updated":"2016-10-17 14:13:15.000000000","message":"ditto","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"},{"author":{"_account_id":19206,"name":"Dawid Deja","email":"dawdej@gmail.com","username":"ddeja"},"change_message_id":"d3bed3783da824a7e7e4070d43b7a11ba6555d12","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        for key, value in six.iteritems(kwargs):"},{"line_number":74,"context_line":"            self._graph.node[task][key] \u003d value"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def has_sequence(self, source, destination, criteria\u003dNone):"},{"line_number":77,"context_line":"        return ["},{"line_number":78,"context_line":"            edge for edge in self._graph.edges(data\u003dTrue, keys\u003dTrue)"},{"line_number":79,"context_line":"            if (edge[0] \u003d\u003d source and edge[1] \u003d\u003d destination and"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_3af44186","line":76,"range":{"start_line":76,"start_character":8,"end_line":76,"end_character":20},"updated":"2016-10-17 14:13:15.000000000","message":"This method should return \u0027True\u0027 or \u0027False\u0027, shouldn\u0027t it?","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"},{"author":{"_account_id":19206,"name":"Dawid Deja","email":"dawdej@gmail.com","username":"ddeja"},"change_message_id":"d3bed3783da824a7e7e4070d43b7a11ba6555d12","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        ]"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if not seqs:"},{"line_number":92,"context_line":"            raise Exception(\u0027Task sequence does not exist.\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if len(seqs) \u003e 1:"},{"line_number":95,"context_line":"            raise Exception(\u0027More than one task sequences found.\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_ba2e91f8","line":92,"range":{"start_line":92,"start_character":12,"end_line":92,"end_character":60},"updated":"2016-10-17 14:13:15.000000000","message":"ditto","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"},{"author":{"_account_id":19206,"name":"Dawid Deja","email":"dawdej@gmail.com","username":"ddeja"},"change_message_id":"d3bed3783da824a7e7e4070d43b7a11ba6555d12","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            raise Exception(\u0027Task sequence does not exist.\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if len(seqs) \u003e 1:"},{"line_number":95,"context_line":"            raise Exception(\u0027More than one task sequences found.\u0027)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        return seqs[0]"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_1a3e9d29","line":95,"range":{"start_line":95,"start_character":12,"end_line":95,"end_character":66},"updated":"2016-10-17 14:13:15.000000000","message":"ditto","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"},{"author":{"_account_id":19206,"name":"Dawid Deja","email":"dawdej@gmail.com","username":"ddeja"},"change_message_id":"d3bed3783da824a7e7e4070d43b7a11ba6555d12","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def get_sequence_attributes(self, attribute):"},{"line_number":100,"context_line":"        return nx.get_edge_attributes(self._graph, attribute)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def add_sequence(self, source, destination, criteria\u003dNone):"},{"line_number":103,"context_line":"        if not self.has_task(source):"},{"line_number":104,"context_line":"            self.add_task(source)"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_3ad7e1c0","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":20},"updated":"2016-10-17 14:13:15.000000000","message":"Name of the method is \u0027add_sequence\u0027, but this method may add or update to sequence. So please change name or behavior so it is consistent.","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"},{"author":{"_account_id":19206,"name":"Dawid Deja","email":"dawdej@gmail.com","username":"ddeja"},"change_message_id":"d3bed3783da824a7e7e4070d43b7a11ba6555d12","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            for n, d in self._graph.in_degree().items() if d \u003d\u003d 0"},{"line_number":134,"context_line":"        ]"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        return sorted(tasks, key\u003dlambda x: x[\u0027name\u0027])"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def get_next_sequences(self, task):"},{"line_number":139,"context_line":"        return sorted("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_1a013d3a","line":136,"range":{"start_line":136,"start_character":15,"end_line":136,"end_character":21},"updated":"2016-10-17 14:13:15.000000000","message":"What is the reason for sorting?","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"},{"author":{"_account_id":5558,"name":"Winson Chan","email":"wcchan@stackstorm.com","username":"winson-c-chan"},"change_message_id":"6918cbe7b3de7fe6e6775c22026fa22bdc2013d9","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            for n, d in self._graph.in_degree().items() if d \u003d\u003d 0"},{"line_number":134,"context_line":"        ]"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        return sorted(tasks, key\u003dlambda x: x[\u0027name\u0027])"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def get_next_sequences(self, task):"},{"line_number":139,"context_line":"        return sorted("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa6399be_daa2289a","line":136,"range":{"start_line":136,"start_character":15,"end_line":136,"end_character":21},"in_reply_to":"fa6399be_1a013d3a","updated":"2016-10-18 18:18:42.000000000","message":"The sorting is done here so the order of task execution is more deterministic. In the unit tests, we validate the exact sequence of task executions. Without sorting here, the sequence of task execution will not be deterministic and very hard to validate during unit tests.","commit_id":"566d513f4b3adb89f1a7f7c2dd1fc1da30208eca"}]}
