)]}'
{"zun/common/utils.py":[{"author":{"_account_id":19457,"name":"aditi sharma","email":"adi.sky17@gmail.com","username":"aditi"},"change_message_id":"a229a9f7ceda186baf5a288d451e7d769415a060","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    \"\"\""},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @functools.wraps(function)"},{"line_number":155,"context_line":"    def docorated_function(*args, **kwargs):"},{"line_number":156,"context_line":"        try:"},{"line_number":157,"context_line":"            return function(*args, **kwargs)"},{"line_number":158,"context_line":"        except errors.APIError as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_4982fec9","line":155,"range":{"start_line":155,"start_character":8,"end_line":155,"end_character":26},"updated":"2016-09-09 09:53:32.000000000","message":"s/docorated/decorated","commit_id":"b425436c36ab6818dc4de2d47a8a980dbc0be98b"},{"author":{"_account_id":13248,"name":"Wenzhi Yu","email":"wenzhi_yu@163.com","username":"yuywz"},"change_message_id":"5e8a4f018462371d97f563459a1f3c718e98516b","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    \"\"\""},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @functools.wraps(function)"},{"line_number":155,"context_line":"    def docorated_function(*args, **kwargs):"},{"line_number":156,"context_line":"        try:"},{"line_number":157,"context_line":"            return function(*args, **kwargs)"},{"line_number":158,"context_line":"        except errors.APIError as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_3e87a913","line":155,"range":{"start_line":155,"start_character":8,"end_line":155,"end_character":26},"in_reply_to":"9a89bdaa_4982fec9","updated":"2016-09-09 10:47:57.000000000","message":"Done","commit_id":"b425436c36ab6818dc4de2d47a8a980dbc0be98b"},{"author":{"_account_id":19457,"name":"aditi sharma","email":"adi.sky17@gmail.com","username":"aditi"},"change_message_id":"a229a9f7ceda186baf5a288d451e7d769415a060","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        except errors.APIError as e:"},{"line_number":159,"context_line":"            raise exception.DockerError(error_msg\u003dsix.text_type(e))"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    return docorated_function"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_e94af2ab","line":161,"updated":"2016-09-09 09:53:32.000000000","message":"s/docorated/decorated","commit_id":"b425436c36ab6818dc4de2d47a8a980dbc0be98b"},{"author":{"_account_id":13248,"name":"Wenzhi Yu","email":"wenzhi_yu@163.com","username":"yuywz"},"change_message_id":"5e8a4f018462371d97f563459a1f3c718e98516b","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        except errors.APIError as e:"},{"line_number":159,"context_line":"            raise exception.DockerError(error_msg\u003dsix.text_type(e))"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    return docorated_function"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a89bdaa_3e8ec927","line":161,"in_reply_to":"9a89bdaa_e94af2ab","updated":"2016-09-09 10:47:57.000000000","message":"Done","commit_id":"b425436c36ab6818dc4de2d47a8a980dbc0be98b"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"1fd6ae99bb18012b9290a19f1f3cb7ea4682199f","unresolved":false,"context_lines":[{"line_number":135,"context_line":"def decorate_all_methods(decorator):"},{"line_number":136,"context_line":"    \u0027\u0027\u0027Decorate all methods of a class.\u0027\u0027\u0027"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def decorated_function(cls):"},{"line_number":139,"context_line":"        for attr_name, attr_val in cls.__dict__.items():"},{"line_number":140,"context_line":"            if (isinstance(attr_val, types.FunctionType) and"},{"line_number":141,"context_line":"                    not attr_name.startswith(\u0027_\u0027)):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_1799cc6e","line":138,"range":{"start_line":138,"start_character":8,"end_line":138,"end_character":26},"updated":"2016-09-09 19:57:12.000000000","message":"How about explicitly decorate each methods instead? It seems it is more clear to put a decorator on top of each method, although your approach is more DRY.","commit_id":"53af6026245c51c02fb624d3caee41b141326b44"},{"author":{"_account_id":13248,"name":"Wenzhi Yu","email":"wenzhi_yu@163.com","username":"yuywz"},"change_message_id":"2ba347911617b8cb9dd68c95995d6bfa1b0e7268","unresolved":false,"context_lines":[{"line_number":135,"context_line":"def decorate_all_methods(decorator):"},{"line_number":136,"context_line":"    \u0027\u0027\u0027Decorate all methods of a class.\u0027\u0027\u0027"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def decorated_function(cls):"},{"line_number":139,"context_line":"        for attr_name, attr_val in cls.__dict__.items():"},{"line_number":140,"context_line":"            if (isinstance(attr_val, types.FunctionType) and"},{"line_number":141,"context_line":"                    not attr_name.startswith(\u0027_\u0027)):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_010fafe1","line":138,"range":{"start_line":138,"start_character":8,"end_line":138,"end_character":26},"in_reply_to":"9a89bdaa_1799cc6e","updated":"2016-09-12 00:52:25.000000000","message":"Agreed, explicitly decorate each method would be more clear. However, DockerHTTPClient does not rewrite all the API methods from docker.Client. So if we decorate each method explicitly, we\u0027ll need to rewrite every method from docker.Client, or do we have any other way to do this?","commit_id":"53af6026245c51c02fb624d3caee41b141326b44"}],"zun/container/docker/utils.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"1fd6ae99bb18012b9290a19f1f3cb7ea4682199f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        client_kwargs[\u0027client_key\u0027] \u003d CONF.docker.key_file"},{"line_number":85,"context_line":"        client_kwargs[\u0027client_cert\u0027] \u003d CONF.docker.key_file"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    yield DockerHTTPClient("},{"line_number":88,"context_line":"        CONF.docker.api_url,"},{"line_number":89,"context_line":"        CONF.docker.docker_remote_api_version,"},{"line_number":90,"context_line":"        CONF.docker.default_timeout,"},{"line_number":91,"context_line":"        **client_kwargs"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"@decorate_all_methods(wrap_docker_api_error)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_db24f0c7","line":92,"range":{"start_line":87,"start_character":0,"end_line":92,"end_character":5},"updated":"2016-09-09 19:57:12.000000000","message":"An alternative is to wrap this call with try ... catch ... for capturing and re-raising the docker exceptions.","commit_id":"53af6026245c51c02fb624d3caee41b141326b44"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"eae7a19285108f157a95f8ee67675061eaac1b5e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        client_kwargs[\u0027client_key\u0027] \u003d CONF.docker.key_file"},{"line_number":85,"context_line":"        client_kwargs[\u0027client_cert\u0027] \u003d CONF.docker.key_file"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    yield DockerHTTPClient("},{"line_number":88,"context_line":"        CONF.docker.api_url,"},{"line_number":89,"context_line":"        CONF.docker.docker_remote_api_version,"},{"line_number":90,"context_line":"        CONF.docker.default_timeout,"},{"line_number":91,"context_line":"        **client_kwargs"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"@decorate_all_methods(wrap_docker_api_error)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_c60baf22","line":92,"range":{"start_line":87,"start_character":0,"end_line":92,"end_character":5},"in_reply_to":"9a89bdaa_a1b9a317","updated":"2016-09-16 21:37:42.000000000","message":"I tried that, it seems to work. I uploaded a new patchset for others to try. If anything is broken, please let me know.","commit_id":"53af6026245c51c02fb624d3caee41b141326b44"},{"author":{"_account_id":13248,"name":"Wenzhi Yu","email":"wenzhi_yu@163.com","username":"yuywz"},"change_message_id":"2ba347911617b8cb9dd68c95995d6bfa1b0e7268","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        client_kwargs[\u0027client_key\u0027] \u003d CONF.docker.key_file"},{"line_number":85,"context_line":"        client_kwargs[\u0027client_cert\u0027] \u003d CONF.docker.key_file"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    yield DockerHTTPClient("},{"line_number":88,"context_line":"        CONF.docker.api_url,"},{"line_number":89,"context_line":"        CONF.docker.docker_remote_api_version,"},{"line_number":90,"context_line":"        CONF.docker.default_timeout,"},{"line_number":91,"context_line":"        **client_kwargs"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"@decorate_all_methods(wrap_docker_api_error)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_a1b9a317","line":92,"range":{"start_line":87,"start_character":0,"end_line":92,"end_character":5},"in_reply_to":"9a89bdaa_db24f0c7","updated":"2016-09-12 00:52:25.000000000","message":"Will this work? If DockerHTTPClient.stop() throws APIError, can we catch the exception here?","commit_id":"53af6026245c51c02fb624d3caee41b141326b44"}]}
