)]}'
{"smaug/services/protection/flows/workflow.py":[{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"e115b628b2af78282cfafb563f8419dc722c2e67","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    cfg.StrOpt(\r"},{"line_number":33,"context_line":"        \u0027workflow_engine\u0027,\r"},{"line_number":34,"context_line":"        default\u003d\"smaug.services.protection.flows.workflow.TaskFlowEngine\",\r"},{"line_number":35,"context_line":"        help\u003d\u0027The engine that we used\u0027)\r"},{"line_number":36,"context_line":"]\r"},{"line_number":37,"context_line":"\r"},{"line_number":38,"context_line":"CONF \u003d cfg.CONF\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_6df4c585","line":35,"range":{"start_line":35,"start_character":14,"end_line":35,"end_character":37},"updated":"2016-02-27 07:02:50.000000000","message":"I think this help message is meaningless, perhaps describe the function of this configured engine insteed?","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"7fcc4cfecbe538c4362f3a8e32671a1e6b9f217b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"CONF \u003d cfg.CONF\r"},{"line_number":39,"context_line":"CONF.register_opts(workflow_opts)\r"},{"line_number":40,"context_line":"\r"},{"line_number":41,"context_line":"LOG \u003d logging.getLogger(__name__)\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"\r"},{"line_number":44,"context_line":"@six.add_metaclass(abc.ABCMeta)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_1506c41c","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":3},"updated":"2016-02-29 02:32:37.000000000","message":"I really think it\u0027s unnecessary to do it twice, please check line 29","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"5f566c6e64e79a75056d05e30787f28ff6e4a610","unresolved":false,"context_lines":[{"line_number":38,"context_line":"CONF \u003d cfg.CONF\r"},{"line_number":39,"context_line":"CONF.register_opts(workflow_opts)\r"},{"line_number":40,"context_line":"\r"},{"line_number":41,"context_line":"LOG \u003d logging.getLogger(__name__)\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"\r"},{"line_number":44,"context_line":"@six.add_metaclass(abc.ABCMeta)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_d8181178","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":3},"in_reply_to":"9aed3d3a_1506c41c","updated":"2016-02-29 02:46:44.000000000","message":"Done,thanks","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"e115b628b2af78282cfafb563f8419dc722c2e67","unresolved":false,"context_lines":[{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"\r"},{"line_number":44,"context_line":"@six.add_metaclass(abc.ABCMeta)\r"},{"line_number":45,"context_line":"class WorkFlowEngine(object):\r"},{"line_number":46,"context_line":"    @abc.abstractmethod\r"},{"line_number":47,"context_line":"    def build_flow(self, name, flow_type\u003dNone):\r"},{"line_number":48,"context_line":"        return\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_0d237906","line":45,"updated":"2016-02-27 07:02:50.000000000","message":"Suggest moving this abstract class definition to another individual file, and the TaskBuilder below as well.","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"acadfd4e20cfcc586632f4be2dd9e7f54b98d2b1","unresolved":false,"context_lines":[{"line_number":44,"context_line":"@six.add_metaclass(abc.ABCMeta)\r"},{"line_number":45,"context_line":"class WorkFlowEngine(object):\r"},{"line_number":46,"context_line":"    @abc.abstractmethod\r"},{"line_number":47,"context_line":"    def build_flow(self, name, flow_type\u003dNone):\r"},{"line_number":48,"context_line":"        return\r"},{"line_number":49,"context_line":"\r"},{"line_number":50,"context_line":"    @abc.abstractmethod\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_f2b7f637","line":47,"updated":"2016-02-29 01:19:56.000000000","message":"seems build_flow should be the interface of taskBuilder, otherwise provider couldn\u0027t build flow with TaskBuilder only.","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"7fcc4cfecbe538c4362f3a8e32671a1e6b9f217b","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return\r"},{"line_number":68,"context_line":"\r"},{"line_number":69,"context_line":"    @abc.abstractmethod\r"},{"line_number":70,"context_line":"    def link_task(self, flow, u, v, **kwargs):\r"},{"line_number":71,"context_line":"        return\r"},{"line_number":72,"context_line":"\r"},{"line_number":73,"context_line":"    @abc.abstractmethod\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_757ab078","line":70,"range":{"start_line":70,"start_character":30,"end_line":70,"end_character":31},"updated":"2016-02-29 02:32:37.000000000","message":"I am not sure I can understand what\u0027s the \"u\" meaning. it should really be helpful to change to full word or add some comments here. the same as \u0027v\u0027","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"5f566c6e64e79a75056d05e30787f28ff6e4a610","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return\r"},{"line_number":68,"context_line":"\r"},{"line_number":69,"context_line":"    @abc.abstractmethod\r"},{"line_number":70,"context_line":"    def link_task(self, flow, u, v, **kwargs):\r"},{"line_number":71,"context_line":"        return\r"},{"line_number":72,"context_line":"\r"},{"line_number":73,"context_line":"    @abc.abstractmethod\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_582361a7","line":70,"range":{"start_line":70,"start_character":30,"end_line":70,"end_character":31},"in_reply_to":"9aed3d3a_757ab078","updated":"2016-02-29 02:46:44.000000000","message":"I will add comments here","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"e115b628b2af78282cfafb563f8419dc722c2e67","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        return\r"},{"line_number":76,"context_line":"\r"},{"line_number":77,"context_line":"\r"},{"line_number":78,"context_line":"class TaskFlowEngine(WorkFlowEngine, TaskBuilder):\r"},{"line_number":79,"context_line":"    def __init__(self):\r"},{"line_number":80,"context_line":"        super(TaskFlowEngine, self).__init__()\r"},{"line_number":81,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_ede9f581","line":78,"updated":"2016-02-27 07:02:50.000000000","message":"Move this class definition to an individual file.","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"e115b628b2af78282cfafb563f8419dc722c2e67","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def __init__(self):\r"},{"line_number":80,"context_line":"        super(TaskFlowEngine, self).__init__()\r"},{"line_number":81,"context_line":"\r"},{"line_number":82,"context_line":"    def build_flow(self, name, flow_type\u003dNone):\r"},{"line_number":83,"context_line":"        \"\"\"build flow\r"},{"line_number":84,"context_line":"\r"},{"line_number":85,"context_line":"        :param name: flow name\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_ed5bb585","line":82,"range":{"start_line":82,"start_character":41,"end_line":82,"end_character":45},"updated":"2016-02-27 07:02:50.000000000","message":"If flow_type default to graph, suggest setting \u0027gragh\u0027 here.","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"7fcc4cfecbe538c4362f3a8e32671a1e6b9f217b","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def __init__(self):\r"},{"line_number":80,"context_line":"        super(TaskFlowEngine, self).__init__()\r"},{"line_number":81,"context_line":"\r"},{"line_number":82,"context_line":"    def build_flow(self, name, flow_type\u003dNone):\r"},{"line_number":83,"context_line":"        \"\"\"build flow\r"},{"line_number":84,"context_line":"\r"},{"line_number":85,"context_line":"        :param name: flow name\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_b5743868","line":82,"range":{"start_line":82,"start_character":25,"end_line":82,"end_character":29},"updated":"2016-02-29 02:32:37.000000000","message":"s/name/flow_name","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"5f566c6e64e79a75056d05e30787f28ff6e4a610","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def __init__(self):\r"},{"line_number":80,"context_line":"        super(TaskFlowEngine, self).__init__()\r"},{"line_number":81,"context_line":"\r"},{"line_number":82,"context_line":"    def build_flow(self, name, flow_type\u003dNone):\r"},{"line_number":83,"context_line":"        \"\"\"build flow\r"},{"line_number":84,"context_line":"\r"},{"line_number":85,"context_line":"        :param name: flow name\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_d85db116","line":82,"range":{"start_line":82,"start_character":25,"end_line":82,"end_character":29},"in_reply_to":"9aed3d3a_b5743868","updated":"2016-02-29 02:46:44.000000000","message":"Done","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"5f566c6e64e79a75056d05e30787f28ff6e4a610","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def __init__(self):\r"},{"line_number":80,"context_line":"        super(TaskFlowEngine, self).__init__()\r"},{"line_number":81,"context_line":"\r"},{"line_number":82,"context_line":"    def build_flow(self, name, flow_type\u003dNone):\r"},{"line_number":83,"context_line":"        \"\"\"build flow\r"},{"line_number":84,"context_line":"\r"},{"line_number":85,"context_line":"        :param name: flow name\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_9867a9e8","line":82,"range":{"start_line":82,"start_character":41,"end_line":82,"end_character":45},"in_reply_to":"9aed3d3a_ed5bb585","updated":"2016-02-29 02:46:44.000000000","message":"Done","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"e115b628b2af78282cfafb563f8419dc722c2e67","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            return\r"},{"line_number":97,"context_line":"        executor \u003d kwargs.get(\u0027executor\u0027, None)\r"},{"line_number":98,"context_line":"        engine \u003d kwargs.get(\u0027engine\u0027, None)\r"},{"line_number":99,"context_line":"        store \u003d kwargs.get(\u0027engine\u0027, None)\r"},{"line_number":100,"context_line":"        if not executor:\r"},{"line_number":101,"context_line":"            executor \u003d futurist.GreenThreadPoolExecutor()\r"},{"line_number":102,"context_line":"        if not engine:\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_cd87d1d5","line":99,"range":{"start_line":99,"start_character":28,"end_line":99,"end_character":34},"updated":"2016-02-27 07:02:50.000000000","message":"\u0027store\u0027 or something?","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"5f566c6e64e79a75056d05e30787f28ff6e4a610","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            return\r"},{"line_number":97,"context_line":"        executor \u003d kwargs.get(\u0027executor\u0027, None)\r"},{"line_number":98,"context_line":"        engine \u003d kwargs.get(\u0027engine\u0027, None)\r"},{"line_number":99,"context_line":"        store \u003d kwargs.get(\u0027engine\u0027, None)\r"},{"line_number":100,"context_line":"        if not executor:\r"},{"line_number":101,"context_line":"            executor \u003d futurist.GreenThreadPoolExecutor()\r"},{"line_number":102,"context_line":"        if not engine:\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_18a279fd","line":99,"range":{"start_line":99,"start_character":28,"end_line":99,"end_character":34},"in_reply_to":"9aed3d3a_cd87d1d5","updated":"2016-02-29 02:46:44.000000000","message":"\u0027store\u0027,thanks","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"7fcc4cfecbe538c4362f3a8e32671a1e6b9f217b","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        return flow_engine\r"},{"line_number":109,"context_line":"\r"},{"line_number":110,"context_line":"    def run_engine(self, flow_engine):\r"},{"line_number":111,"context_line":"        if not flow_engine:\r"},{"line_number":112,"context_line":"            LOG.error(_LE(\"Flow engine is None,get it first\"))\r"},{"line_number":113,"context_line":"            return\r"},{"line_number":114,"context_line":"        flow_engine.run()\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_15f52456","line":111,"range":{"start_line":111,"start_character":11,"end_line":111,"end_character":14},"updated":"2016-02-29 02:32:37.000000000","message":"i suggest to support a default engine when the input is None? it\u0027s a better practice than do nothing with error log.","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"5f566c6e64e79a75056d05e30787f28ff6e4a610","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        return flow_engine\r"},{"line_number":109,"context_line":"\r"},{"line_number":110,"context_line":"    def run_engine(self, flow_engine):\r"},{"line_number":111,"context_line":"        if not flow_engine:\r"},{"line_number":112,"context_line":"            LOG.error(_LE(\"Flow engine is None,get it first\"))\r"},{"line_number":113,"context_line":"            return\r"},{"line_number":114,"context_line":"        flow_engine.run()\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_78c8e5a8","line":111,"range":{"start_line":111,"start_character":11,"end_line":111,"end_character":14},"in_reply_to":"9aed3d3a_15f52456","updated":"2016-02-29 02:46:44.000000000","message":"No,each provider should build a flow,we can\u0027t support default engine","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":15069,"name":"zhonghuali","email":"lizhonghua.li@huawei.com","username":"sloblee"},"change_message_id":"7fcc4cfecbe538c4362f3a8e32671a1e6b9f217b","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        return flow_engine.storage.fetch_all()\r"},{"line_number":123,"context_line":"\r"},{"line_number":124,"context_line":"    def create_task(self, function, **kwargs):\r"},{"line_number":125,"context_line":"        provides \u003d kwargs.get(\u0027providers\u0027, None)\r"},{"line_number":126,"context_line":"        name \u003d kwargs.get(\u0027name\u0027, None)\r"},{"line_number":127,"context_line":"        requires \u003d kwargs.get(\u0027requires\u0027, None)\r"},{"line_number":128,"context_line":"        auto_extract \u003d kwargs.get(\u0027auto_extract\u0027, True)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_75b47081","line":125,"range":{"start_line":125,"start_character":31,"end_line":125,"end_character":40},"updated":"2016-02-29 02:32:37.000000000","message":"i am not sure why there will be some difference between the member name and the parameter name?","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"5f566c6e64e79a75056d05e30787f28ff6e4a610","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        return flow_engine.storage.fetch_all()\r"},{"line_number":123,"context_line":"\r"},{"line_number":124,"context_line":"    def create_task(self, function, **kwargs):\r"},{"line_number":125,"context_line":"        provides \u003d kwargs.get(\u0027providers\u0027, None)\r"},{"line_number":126,"context_line":"        name \u003d kwargs.get(\u0027name\u0027, None)\r"},{"line_number":127,"context_line":"        requires \u003d kwargs.get(\u0027requires\u0027, None)\r"},{"line_number":128,"context_line":"        auto_extract \u003d kwargs.get(\u0027auto_extract\u0027, True)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_f8bcf507","line":125,"range":{"start_line":125,"start_character":31,"end_line":125,"end_character":40},"in_reply_to":"9aed3d3a_75b47081","updated":"2016-02-29 02:46:44.000000000","message":"thanks","commit_id":"48ea9649d8c48ddc98b136138ff8252bd8a3c9fd"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"36c94733a72a9c4aa08e4fca6d4291ddb4cb70e1","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        return\r"},{"line_number":59,"context_line":"\r"},{"line_number":60,"context_line":"    @abc.abstractmethod\r"},{"line_number":61,"context_line":"    def link_task(self, flow, u, v, **kwargs):\r"},{"line_number":62,"context_line":"        \"\"\"Link existing node as a runtime dependency of existing node v\r"},{"line_number":63,"context_line":"\r"},{"line_number":64,"context_line":"        :param u: task or flow to create a link from (must exist already)\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa0719c6_b66f8c91","line":61,"range":{"start_line":61,"start_character":34,"end_line":61,"end_character":44},"updated":"2016-03-21 13:37:28.000000000","message":"What are the kwargs argument for?","commit_id":"a06a1b74a5e39efaac5735974211e46ae1cc47b4"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"36c94733a72a9c4aa08e4fca6d4291ddb4cb70e1","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            return linear_flow.Flow(flow_name)\r"},{"line_number":86,"context_line":"        elif flow_type \u003d\u003d \u0027graph\u0027:\r"},{"line_number":87,"context_line":"            return graph_flow.Flow(flow_name)\r"},{"line_number":88,"context_line":"        else:\r"},{"line_number":89,"context_line":"            LOG.error(_LE(\"unsupported flow type:%s\"), flow_type)\r"},{"line_number":90,"context_line":"            return\r"},{"line_number":91,"context_line":"\r"},{"line_number":92,"context_line":"    def get_engine(self, flow, **kwargs):\r"},{"line_number":93,"context_line":"        if flow is None:\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa0719c6_3631bca3","line":90,"range":{"start_line":88,"start_character":8,"end_line":90,"end_character":18},"updated":"2016-03-21 13:37:28.000000000","message":"raise a ValueError instead of silently failing","commit_id":"a06a1b74a5e39efaac5735974211e46ae1cc47b4"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"36c94733a72a9c4aa08e4fca6d4291ddb4cb70e1","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            return\r"},{"line_number":91,"context_line":"\r"},{"line_number":92,"context_line":"    def get_engine(self, flow, **kwargs):\r"},{"line_number":93,"context_line":"        if flow is None:\r"},{"line_number":94,"context_line":"            LOG.error(_LE(\"Flow is None,build it first\"))\r"},{"line_number":95,"context_line":"            return\r"},{"line_number":96,"context_line":"        executor \u003d kwargs.get(\u0027executor\u0027, None)\r"},{"line_number":97,"context_line":"        engine \u003d kwargs.get(\u0027engine\u0027, None)\r"},{"line_number":98,"context_line":"        store \u003d kwargs.get(\u0027store\u0027, None)\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa0719c6_56d39038","line":95,"range":{"start_line":93,"start_character":8,"end_line":95,"end_character":18},"updated":"2016-03-21 13:37:28.000000000","message":"Throw an error instead of silently failing","commit_id":"a06a1b74a5e39efaac5735974211e46ae1cc47b4"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"36c94733a72a9c4aa08e4fca6d4291ddb4cb70e1","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        return flow_engine.storage.fetch_all()\r"},{"line_number":122,"context_line":"\r"},{"line_number":123,"context_line":"    def create_task(self, function, **kwargs):\r"},{"line_number":124,"context_line":"        provides \u003d kwargs.get(\u0027provides\u0027, None)\r"},{"line_number":125,"context_line":"        name \u003d kwargs.get(\u0027name\u0027, None)\r"},{"line_number":126,"context_line":"        requires \u003d kwargs.get(\u0027requires\u0027, None)\r"},{"line_number":127,"context_line":"        auto_extract \u003d kwargs.get(\u0027auto_extract\u0027, True)\r"},{"line_number":128,"context_line":"        rebind \u003d kwargs.get(\u0027rebind\u0027, None)\r"},{"line_number":129,"context_line":"        revert \u003d kwargs.get(\u0027revert\u0027, None)\r"},{"line_number":130,"context_line":"        version \u003d kwargs.get(\u0027version\u0027, None)\r"},{"line_number":131,"context_line":"        inject \u003d kwargs.get(\u0027inject\u0027, None)\r"},{"line_number":132,"context_line":"        if function:\r"},{"line_number":133,"context_line":"            return task.FunctorTask(function,\r"},{"line_number":134,"context_line":"                                    name\u003dname,\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa0719c6_36941c36","line":131,"range":{"start_line":124,"start_character":0,"end_line":131,"end_character":43},"updated":"2016-03-21 13:37:28.000000000","message":"Aren\u0027t the kwargs arguments to the function.\nWhat is the point of having a base class if non of the parameters are known without knowing what the concrete implementation is.","commit_id":"a06a1b74a5e39efaac5735974211e46ae1cc47b4"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"fcee49594813e94ce0661409d301fd112f76f0ce","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":56,"context_line":"class TaskBuilder(object):"},{"line_number":57,"context_line":"    @abc.abstractmethod"},{"line_number":58,"context_line":"    def create_task(self, function, requires\u003dNone, provides\u003dNone,"},{"line_number":59,"context_line":"                    inject\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_27243d5c","line":56,"range":{"start_line":56,"start_character":0,"end_line":56,"end_character":26},"updated":"2016-04-07 13:47:37.000000000","message":"No need for additional interface. You can merge this class into WorkFlowEngine.","commit_id":"1b41d4b5be2e72d687fdfd3e2835b4658816055c"}]}
