)]}'
{"smaug/services/protection/graph.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a3481d86a4ed3e9060a41ec58f6a61f80fce9154","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":92,"context_line":"class GraphWalkerListener(object):"},{"line_number":93,"context_line":"    @abc.abstractmethod"},{"line_number":94,"context_line":"    def on_node_enter(self, node, already_visited):"},{"line_number":95,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_98f9a483","line":92,"updated":"2016-02-16 08:26:41.000000000","message":"Consider adding documentation to abstract class","commit_id":"9c140671b2fb4f83fdc980eaf2e51b6054778a50"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"a3481d86a4ed3e9060a41ec58f6a61f80fce9154","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        self._walk_graph(source_nodes, set())"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _walk_graph(self, source_nodes, visited_nodes):"},{"line_number":116,"context_line":"        for node in source_nodes:"},{"line_number":117,"context_line":"            for listener in self._listeners:"},{"line_number":118,"context_line":"                listener.on_node_enter(node, node in visited_nodes)"},{"line_number":119,"context_line":"                visited_nodes.add(node)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_78d780bf","line":116,"updated":"2016-02-16 08:26:41.000000000","message":"Consider verifying that node is not in visited_nodes, to avoid infinite loops on cyclic graphs. If graphs are expected to be acyclic, consider at least raising an exception.","commit_id":"9c140671b2fb4f83fdc980eaf2e51b6054778a50"}]}
