)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"49ac8a25d24fe26ea7596f4019ab20249a6d8547","unresolved":false,"context_lines":[{"line_number":16,"context_line":"So change the comparing statement to a more accurate way, compare"},{"line_number":17,"context_line":"the front slice of the string directly to the tag."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"TrivialFix"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: Ic343970578477362460340b01e5766e03c7d63a4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa6399be_30d407bc","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":10},"updated":"2016-10-19 11:12:07.000000000","message":"It is not trivial fix, it influences behavior of the driver.","commit_id":"d14d0a2c6a53342570fbd8a0ccabc2971d9239c8"}],"manila/share/drivers/huawei/v3/helper.py":[{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"0e7dc8948aa55c2b327273e48f3e5e23e95baba3","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        need_encode \u003d False"},{"line_number":191,"context_line":"        for key in [\u0027UserName\u0027, \u0027UserPassword\u0027]:"},{"line_number":192,"context_line":"            node \u003d root.find(\u0027Storage/%s\u0027 % key)"},{"line_number":193,"context_line":"            if node.text[:4] \u003d\u003d prefix_name:"},{"line_number":194,"context_line":"                logininfo[key] \u003d base64.b64decode("},{"line_number":195,"context_line":"                    six.b(node.text[4:])).decode()"},{"line_number":196,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6895a0_c7aa7c70","line":193,"updated":"2016-10-21 05:18:51.000000000","message":"Just for the record - there is a startswith() method for string. https://docs.python.org/2/library/stdtypes.html#str.startswith .","commit_id":"458fdfce755f556992795e25ff90ffc60b64f8b3"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"5d4c8b94e59cbcd72ac7480c08a6b6c426e5dbbe","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        need_encode \u003d False"},{"line_number":191,"context_line":"        for key in [\u0027UserName\u0027, \u0027UserPassword\u0027]:"},{"line_number":192,"context_line":"            node \u003d root.find(\u0027Storage/%s\u0027 % key)"},{"line_number":193,"context_line":"            if node.text[:4] \u003d\u003d prefix_name:"},{"line_number":194,"context_line":"                logininfo[key] \u003d base64.b64decode("},{"line_number":195,"context_line":"                    six.b(node.text[4:])).decode()"},{"line_number":196,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5da102_0eb89fc7","line":193,"in_reply_to":"ba5da102_48db6f4f","updated":"2016-11-01 12:38:23.000000000","message":"+1","commit_id":"458fdfce755f556992795e25ff90ffc60b64f8b3"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"e6c9bef8c1ebd358720588abf133d23de9f0391a","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        need_encode \u003d False"},{"line_number":191,"context_line":"        for key in [\u0027UserName\u0027, \u0027UserPassword\u0027]:"},{"line_number":192,"context_line":"            node \u003d root.find(\u0027Storage/%s\u0027 % key)"},{"line_number":193,"context_line":"            if node.text[:4] \u003d\u003d prefix_name:"},{"line_number":194,"context_line":"                logininfo[key] \u003d base64.b64decode("},{"line_number":195,"context_line":"                    six.b(node.text[4:])).decode()"},{"line_number":196,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6895a0_d05f940c","line":193,"in_reply_to":"da6895a0_c7aa7c70","updated":"2016-10-21 07:03:45.000000000","message":"Aha, indeed, thanks for your reminder.","commit_id":"458fdfce755f556992795e25ff90ffc60b64f8b3"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"36db572ea23543105576234fb2750421023f646f","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        need_encode \u003d False"},{"line_number":191,"context_line":"        for key in [\u0027UserName\u0027, \u0027UserPassword\u0027]:"},{"line_number":192,"context_line":"            node \u003d root.find(\u0027Storage/%s\u0027 % key)"},{"line_number":193,"context_line":"            if node.text[:4] \u003d\u003d prefix_name:"},{"line_number":194,"context_line":"                logininfo[key] \u003d base64.b64decode("},{"line_number":195,"context_line":"                    six.b(node.text[4:])).decode()"},{"line_number":196,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5da102_48db6f4f","line":193,"in_reply_to":"da6895a0_d05f940c","updated":"2016-11-01 11:44:03.000000000","message":"Actually it is really good catch. For the moment, you assume some specific length of var in this part of code. But you can avoid dependency on it using \"startswith\" method. So, I would say, it is better to update this commit.","commit_id":"458fdfce755f556992795e25ff90ffc60b64f8b3"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"ba4832a8ab75b567eebf03a73b0ee28d0bfe59c1","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        need_encode \u003d False"},{"line_number":191,"context_line":"        for key in [\u0027UserName\u0027, \u0027UserPassword\u0027]:"},{"line_number":192,"context_line":"            node \u003d root.find(\u0027Storage/%s\u0027 % key)"},{"line_number":193,"context_line":"            if node.startswith(prefix_name):"},{"line_number":194,"context_line":"                logininfo[key] \u003d base64.b64decode("},{"line_number":195,"context_line":"                    six.b(node.text[4:])).decode()"},{"line_number":196,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_e6229551","line":193,"range":{"start_line":193,"start_character":15,"end_line":193,"end_character":31},"updated":"2016-11-02 05:53:10.000000000","message":"node.text.startswith()","commit_id":"f8c69e6b4d030d4bc6a368fb07548fe04dd57776"}],"manila/tests/share/drivers/huawei/test_huawei_nas.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"13688087e770428fe20b35c911872b9c7ed6c8f2","unresolved":false,"context_lines":[{"line_number":4549,"context_line":"               \u0027expect_password\u0027: \u0027123!$$$456\u0027,"},{"line_number":4550,"context_line":"               },"},{"line_number":4551,"context_line":"              )"},{"line_number":4552,"context_line":"    def test__get_login_info(self, data):"},{"line_number":4553,"context_line":"        configs \u003d {\u0027Storage/RestURL\u0027: \u0027https://123456\u0027,"},{"line_number":4554,"context_line":"                   \u0027Storage/UserName\u0027: data[\u0027username\u0027],"},{"line_number":4555,"context_line":"                   \u0027Storage/UserPassword\u0027: data[\u0027password\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba5da102_4475eff7","line":4552,"range":{"start_line":4552,"start_character":35,"end_line":4552,"end_character":39},"updated":"2016-11-02 12:26:49.000000000","message":"You do not use \"data\" object directly, so, it means it is redundant to expect it in method interface. You could code this test as of following:\n\n\"\"\"\n@ddt.data({\n    \u0027username\u0027: \u0027abc\u0027,\n    \u0027password\u0027: \u0027123456\u0027,\n    \u0027expect_username\u0027: \u0027abc\u0027,\n    \u0027expect_password\u0027: \u0027123456\u0027,\n}, {\n    \u0027username\u0027: \u0027!$$$YWJj\u0027,\n    \u0027password\u0027: \u0027!$$$MTIzNDU2\u0027,\n    \u0027expect_username\u0027: \u0027abc\u0027,\n    \u0027expect_password\u0027: \u0027123456\u0027,\n}, {\n    \u0027username\u0027: \u0027ab!$$$c\u0027,\n    \u0027password\u0027: \u0027123!$$$456\u0027,\n    \u0027expect_username\u0027: \u0027ab!$$$c\u0027,\n    \u0027expect_password\u0027: \u0027123!$$$456\u0027,\n})\n@ddt.unpack\ndef test__get_login_info(\n        self, username, password, expected_username,\n        expected_password):\n    configs \u003d {\n        \u0027Storage/RestURL\u0027: \u0027https://123456\u0027,\n        \u0027Storage/UserName\u0027: username,\n        \u0027Storage/UserPassword\u0027: password,\n    }\n    self.mock_object(\n        ET, \u0027parse\u0027,\n        mock.Mock(return_value\u003dFakeConfigParseTree(configs)))\n\n    result \u003d self.driver.plugin.helper._get_login_info()\n\n    self.assertEqual(expect_username, result[\u0027UserName\u0027])\n    self.assertEqual(expect_password, result[\u0027UserPassword\u0027])\n    ET.parse.assert_called_once_with(Foo, Bar)\n\"\"\"","commit_id":"f210accd744b76199d87407049b0f1ae68b835cc"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"aa03b88a3a58b68f65c34173ee87df3b30e94665","unresolved":false,"context_lines":[{"line_number":4550,"context_line":"               },"},{"line_number":4551,"context_line":"              )"},{"line_number":4552,"context_line":"    def test__get_login_info(self, data):"},{"line_number":4553,"context_line":"        configs \u003d {\u0027Storage/RestURL\u0027: \u0027https://123456\u0027,"},{"line_number":4554,"context_line":"                   \u0027Storage/UserName\u0027: data[\u0027username\u0027],"},{"line_number":4555,"context_line":"                   \u0027Storage/UserPassword\u0027: data[\u0027password\u0027],"},{"line_number":4556,"context_line":"                   }"},{"line_number":4557,"context_line":"        self.mock_object(ET,"},{"line_number":4558,"context_line":"                         \u0027parse\u0027,"},{"line_number":4559,"context_line":"                         mock.Mock(return_value\u003dFakeConfigParseTree(configs)))"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba5da102_44040f17","line":4556,"range":{"start_line":4553,"start_character":8,"end_line":4556,"end_character":20},"updated":"2016-11-02 12:28:04.000000000","message":"http://docs.openstack.org/developer/hacking/#dictionaries-lists","commit_id":"f210accd744b76199d87407049b0f1ae68b835cc"}]}
