)]}'
{"tempest/api/object_storage/test_object_services.py":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"a9c0360df0eb69057632939a1aa74b1760f5a9e7","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        object_name \u003d data_utils.rand_name(name\u003d\u0027TestObject\u0027)"},{"line_number":134,"context_line":"        data \u003d data_utils.arbitrary_string()"},{"line_number":135,"context_line":"        md5 \u003d hashlib.md5(data).hexdigest()"},{"line_number":136,"context_line":"        metadata \u003d {\u0027Etag\u0027: md5}"},{"line_number":137,"context_line":"        resp, _ \u003d self.object_client.create_object("},{"line_number":138,"context_line":"            self.container_name,"},{"line_number":139,"context_line":"            object_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F94aM%3D","line":136,"updated":"2014-02-02 16:10:39.000000000","message":"Is it really a strong etag ?","commit_id":"7bdd495d07ac8ce68d8b50831222c88903df6e0e"},{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"f5bbe271126cc51a6bb193e51d4e8ebd29bb024c","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        object_name \u003d data_utils.rand_name(name\u003d\u0027TestObject\u0027)"},{"line_number":134,"context_line":"        data \u003d data_utils.arbitrary_string()"},{"line_number":135,"context_line":"        md5 \u003d hashlib.md5(data).hexdigest()"},{"line_number":136,"context_line":"        metadata \u003d {\u0027Etag\u0027: md5}"},{"line_number":137,"context_line":"        resp, _ \u003d self.object_client.create_object("},{"line_number":138,"context_line":"            self.container_name,"},{"line_number":139,"context_line":"            object_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F93m0%3D","line":136,"in_reply_to":"AAAAUH%2F94aM%3D","updated":"2014-02-03 02:05:08.000000000","message":"Yes, it is a strong etag. \n\n# I did not really take the difference between \"strong\" and \"weak\" etag into consideration. It seems that Swift only supports Strong ETag.","commit_id":"7bdd495d07ac8ce68d8b50831222c88903df6e0e"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"f0a35262b2c23913600e874a17c224adaa2aec94","unresolved":false,"context_lines":[{"line_number":862,"context_line":"        self.assertEqual(resp[actual_meta_key], meta_value)"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":865,"context_line":"    def test_copy_object_with_x_fresh_metadata(self):"},{"line_number":866,"context_line":"        # copy object with x_fresh_metadata"},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"        # create source object"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2Fr3s%3D","line":865,"updated":"2014-03-04 17:28:02.000000000","message":"The three following tests share a lot of common codes. Could it possible to do some code factoring ?","commit_id":"8fac3273d8541f93640a16379ea8546e3d048238"},{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"d35b8e95bc45f3eca2c6db0c38db18c99621bf76","unresolved":false,"context_lines":[{"line_number":862,"context_line":"        self.assertEqual(resp[actual_meta_key], meta_value)"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":865,"context_line":"    def test_copy_object_with_x_fresh_metadata(self):"},{"line_number":866,"context_line":"        # copy object with x_fresh_metadata"},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"        # create source object"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2FSI8%3D","line":865,"in_reply_to":"AAAAVn%2F%2Fr3s%3D","updated":"2014-03-07 02:52:39.000000000","message":"Done","commit_id":"8fac3273d8541f93640a16379ea8546e3d048238"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"31f677a8418aa4ebf3c2ba237598542cc983cd28","unresolved":false,"context_lines":[{"line_number":861,"context_line":"        self.assertEqual(resp[actual_meta_key], meta_value)"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":864,"context_line":"    def test_copy_object_with_x_fresh_metadata(self):"},{"line_number":865,"context_line":"        # copy object with x_fresh_metadata"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"        # create source object"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FDwY%3D","line":864,"updated":"2014-03-10 10:22:16.000000000","message":"You can refactor the 3 tests test_copy_object_with_x_fresh_metadata, test_copy_object_with_x_object_metakey and test_copy_object_with_x_object_meta. They all do the same thing : 1) create source object 2) copy object 3) check destination object.\n\nOnly the metadata changes.\n\nIMO, you should define 3 private methods 1) \u0027def _create_object(...)\u0027  2) \u0027def _copy_object(metadata,...)\u0027 3) \u0027def check_dst_object(...)\u0027 Then in test_copy_object_with_x_fresh_metadata, test_copy_object_with_x_object_metakey and test_copy_object_with_x_object_meta you would just call the 3 private methods with the appropriate args.","commit_id":"79ef997ef7b3636c8ecccc4058a4c8fc0f0013ea"},{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"4c23e6a1620e242ca33be35d1fe2037b32669a30","unresolved":false,"context_lines":[{"line_number":861,"context_line":"        self.assertEqual(resp[actual_meta_key], meta_value)"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":864,"context_line":"    def test_copy_object_with_x_fresh_metadata(self):"},{"line_number":865,"context_line":"        # copy object with x_fresh_metadata"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"        # create source object"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2B9GU%3D","line":864,"in_reply_to":"AAAAVn%2F%2FDwY%3D","updated":"2014-03-11 02:56:48.000000000","message":"ASAP, I will create 3 private methods as you suggested (_create_object is already done). Thanks for your suggestion.\n\nI think it is better to remain assertion statements of COPY responses outside the private method _copy_object in the same way of other test cases, because this will help people understand what are checked in each test case.","commit_id":"79ef997ef7b3636c8ecccc4058a4c8fc0f0013ea"}],"tempest/services/object_storage/object_client.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"27f6b5dc0264f936c8642a9cf459ad747f54f718","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        if self.base_url is None:"},{"line_number":182,"context_line":"            self._set_auth()"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        parsed \u003d urlparse.urlparse(self.base_url)"},{"line_number":185,"context_line":"        if parsed.scheme \u003d\u003d \u0027https\u0027:"},{"line_number":186,"context_line":"            conn \u003d httplib.HTTPSConnection(parsed.netloc)"},{"line_number":187,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BXbY%3D","line":184,"updated":"2014-02-21 15:55:33.000000000","message":"Duplicate code here and L350. I suggest a small helper function :)","commit_id":"416a15fb2f1e501d5a60676ecded2c1380da58a6"},{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"f51875f076bd54fcfea23e4ab5c3c46d55029294","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        if self.base_url is None:"},{"line_number":182,"context_line":"            self._set_auth()"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        parsed \u003d urlparse.urlparse(self.base_url)"},{"line_number":185,"context_line":"        if parsed.scheme \u003d\u003d \u0027https\u0027:"},{"line_number":186,"context_line":"            conn \u003d httplib.HTTPSConnection(parsed.netloc)"},{"line_number":187,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAVX%2F%2F7MI%3D","line":184,"in_reply_to":"AAAAUX%2F%2BXbY%3D","updated":"2014-02-27 10:45:31.000000000","message":"Done","commit_id":"416a15fb2f1e501d5a60676ecded2c1380da58a6"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"f0a35262b2c23913600e874a17c224adaa2aec94","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import httplib"},{"line_number":17,"context_line":"import urllib"},{"line_number":18,"context_line":"import urlparse"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from tempest.common import http"},{"line_number":21,"context_line":"from tempest.common.rest_client import RestClient"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2Fr%2F4%3D","line":18,"updated":"2014-03-04 17:28:02.000000000","message":"Maybe : import six.moves.urllib.parse as urlparse\nJust to support those good guys how try to have tempest working with python3 :)\n\nAnd I you feel brave enough, replace httplib with six.moves.http_client","commit_id":"8fac3273d8541f93640a16379ea8546e3d048238"},{"author":{"_account_id":8859,"name":"Daisuke Morita","email":"morita.daisuke@ntti3.com","username":"morrisson"},"change_message_id":"d35b8e95bc45f3eca2c6db0c38db18c99621bf76","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import httplib"},{"line_number":17,"context_line":"import urllib"},{"line_number":18,"context_line":"import urlparse"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from tempest.common import http"},{"line_number":21,"context_line":"from tempest.common.rest_client import RestClient"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVn%2F%2FST4%3D","line":18,"in_reply_to":"AAAAVn%2F%2Fr%2F4%3D","updated":"2014-03-07 02:52:39.000000000","message":"Thanks for your advice. However, the purpose of this patch is to add test cases and, honestly, I am not familiar now with writing code compatible with multiple python versions. Let me cope with this issue in future patch.","commit_id":"8fac3273d8541f93640a16379ea8546e3d048238"}]}
