)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"a3023f0aba4f23d8499c5a25b278a750f8a0c28d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"3: inclusion of special characters, e.g. @, #, $ etc."},{"line_number":13,"context_line":"4: at least 15 characters in length"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"fixes Bug1448217"},{"line_number":16,"context_line":"Closes-Bug: 1448217"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I86bf157f1bdb44f5fc579dc5317784fe31df8521"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"5afe65bd_6d4bb75a","line":15,"updated":"2015-06-02 02:48:11.000000000","message":"this line 15 seems unnecessary because of the following line.","commit_id":"c5f28aaec1f5bfe2bcfed4a58928464f3b597b76"},{"author":{"_account_id":9479,"name":"yuxingw","email":"yuxingw@cn.ibm.com","username":"yuxingw"},"change_message_id":"71e699c5a038d7199cc75d2ea2c4d4fc49b24625","unresolved":false,"context_lines":[{"line_number":12,"context_line":"3: inclusion of special characters, e.g. @, #, $ etc."},{"line_number":13,"context_line":"4: at least 15 characters in length"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"fixes Bug1448217"},{"line_number":16,"context_line":"Closes-Bug: 1448217"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I86bf157f1bdb44f5fc579dc5317784fe31df8521"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"5afe65bd_7f8d9c7a","line":15,"in_reply_to":"5afe65bd_6d4bb75a","updated":"2015-06-02 05:40:34.000000000","message":"Thanks. I deleted this line","commit_id":"c5f28aaec1f5bfe2bcfed4a58928464f3b597b76"}],"tempest_lib/common/utils/data_utils.py":[{"author":{"_account_id":7217,"name":"Hugh Saunders","email":"hugh@wherenow.org","username":"hughsaunders"},"change_message_id":"9d2baca4b17224a09079b0c44af050d5e0555326","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return rand_name"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def rand_password():"},{"line_number":61,"context_line":"    \"\"\"Generate a random password representing"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :return: a random string"}],"source_content_type":"text/x-python","patch_set":5,"id":"3acd31a7_e9ba1dc0","line":60,"updated":"2015-04-29 16:04:07.000000000","message":"Is this function used? Maybe you could include a test that makes use of this function?","commit_id":"a60864970a4fd165b597c599c4f1ed9cbe67528e"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"6b7fdaa0e0b0dc88946be704b01b4bfac8923456","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    digits \u003d string.digits"},{"line_number":69,"context_line":"    puncs \u003d \u0027!@#$%^\u0026*()\u0027"},{"line_number":70,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":71,"context_line":"    password \u003d upper_char + \u0027\u0027.join(random.choice(seed) for x in range(length))"},{"line_number":72,"context_line":"    return password"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3acd31a7_67573803","line":71,"updated":"2015-04-30 10:01:52.000000000","message":"This expression generates string with a length of \"length+1\" chars. Seems, it should be like this:\npassword \u003d upper_char + \u0027\u0027.join(random.choice(seed) for x in range(length-1))","commit_id":"c83982daae7b45662b9b50c015bd110161ba7172"},{"author":{"_account_id":9479,"name":"yuxingw","email":"yuxingw@cn.ibm.com","username":"yuxingw"},"change_message_id":"5701fda212e04f7304b8712fe625be729e651559","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    digits \u003d string.digits"},{"line_number":69,"context_line":"    puncs \u003d \u0027!@#$%^\u0026*()\u0027"},{"line_number":70,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":71,"context_line":"    password \u003d upper_char + \u0027\u0027.join(random.choice(seed) for x in range(length))"},{"line_number":72,"context_line":"    return password"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3acd31a7_44b0afdd","line":71,"in_reply_to":"3acd31a7_67573803","updated":"2015-05-08 13:57:34.000000000","message":"I have modified it as you mentioned","commit_id":"c83982daae7b45662b9b50c015bd110161ba7172"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"5b0c5e8d3fd95deee5ba8615420e0dfc79e65eed","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def rand_password(length\u003d15):"},{"line_number":61,"context_line":"    \"\"\"Generate a random password"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :return: a random string"},{"line_number":64,"context_line":"    :rtype: string"},{"line_number":65,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_6975a496","line":62,"updated":"2015-05-07 15:20:37.000000000","message":"You need to mention the length param in the docstring too.","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":9479,"name":"yuxingw","email":"yuxingw@cn.ibm.com","username":"yuxingw"},"change_message_id":"55d0db621cd535dae7e2ad3772579a08fc5483d5","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def rand_password(length\u003d15):"},{"line_number":61,"context_line":"    \"\"\"Generate a random password"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :return: a random string"},{"line_number":64,"context_line":"    :rtype: string"},{"line_number":65,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_a513bcb7","line":62,"in_reply_to":"1aca2d91_6975a496","updated":"2015-05-08 13:36:25.000000000","message":"Thanks Matthew.\nI have add the length param.\n:param int length: The length of password that you expect to set","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"5b0c5e8d3fd95deee5ba8615420e0dfc79e65eed","unresolved":false,"context_lines":[{"line_number":60,"context_line":"def rand_password(length\u003d15):"},{"line_number":61,"context_line":"    \"\"\"Generate a random password"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :return: a random string"},{"line_number":64,"context_line":"    :rtype: string"},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    upper \u003d random.choice(string.ascii_uppercase)"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_499f88b4","line":63,"updated":"2015-05-07 15:20:37.000000000","message":"Maybe we should explain it\u0027s a password that\u0027ll have the an upper case, number, and punctuation.","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":9479,"name":"yuxingw","email":"yuxingw@cn.ibm.com","username":"yuxingw"},"change_message_id":"55d0db621cd535dae7e2ad3772579a08fc5483d5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"def rand_password(length\u003d15):"},{"line_number":61,"context_line":"    \"\"\"Generate a random password"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :return: a random string"},{"line_number":64,"context_line":"    :rtype: string"},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    upper \u003d random.choice(string.ascii_uppercase)"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_a5617c3b","line":63,"in_reply_to":"1aca2d91_499f88b4","updated":"2015-05-08 13:36:25.000000000","message":"Thanks very much for your remind.\nThe explanation for password has been added:\n    :return: a random password. The format is\n             \u0027\u003crandom upper letter\u003e-\u003crandom number\u003e-\u003crandom special character\u003e\n              -\u003crandom ascii letters or digit characters or special symbols\u003e\u0027\n             (e.g. \u0027G2*ac8\u0026lKFFgh%2\u0027)","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"7b9b5f59c95a48fd91a17c0d2fedd2e320646152","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    digit \u003d random.choice(string.digits)"},{"line_number":70,"context_line":"    puncs \u003d \u0027~!@#$%^\u0026*_\u003d+\u0027"},{"line_number":71,"context_line":"    punc \u003d random.choice(puncs)"},{"line_number":72,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":73,"context_line":"    pre \u003d upper + digit + punc"},{"line_number":74,"context_line":"    password \u003d pre + \u0027\u0027.join(random.choice(seed) for x in range(length - 3))"},{"line_number":75,"context_line":"    return password"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_46033710","line":72,"updated":"2015-05-06 10:03:02.000000000","message":"I\u0027m not sure, but maybe it will be better to move seed variable and password template in configuration file. Different security providers can have different requirements according to passwords. Current values will be a good default, I think.","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"5b0c5e8d3fd95deee5ba8615420e0dfc79e65eed","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    digit \u003d random.choice(string.digits)"},{"line_number":70,"context_line":"    puncs \u003d \u0027~!@#$%^\u0026*_\u003d+\u0027"},{"line_number":71,"context_line":"    punc \u003d random.choice(puncs)"},{"line_number":72,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":73,"context_line":"    pre \u003d upper + digit + punc"},{"line_number":74,"context_line":"    password \u003d pre + \u0027\u0027.join(random.choice(seed) for x in range(length - 3))"},{"line_number":75,"context_line":"    return password"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_c90f182d","line":72,"in_reply_to":"1aca2d91_04a3bf50","updated":"2015-05-07 15:20:37.000000000","message":"Right tempest-lib doesn\u0027t have a config file, but I\u0027m fine with adding a kwarg to optionally customize the seed to use. But we can always add that to this function as a follow up patch too. My only comment was on making the password generator a separate function from rand_name.","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":9479,"name":"yuxingw","email":"yuxingw@cn.ibm.com","username":"yuxingw"},"change_message_id":"92b4d26db6826ced4377f882bb21532315326b79","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    digit \u003d random.choice(string.digits)"},{"line_number":70,"context_line":"    puncs \u003d \u0027~!@#$%^\u0026*_\u003d+\u0027"},{"line_number":71,"context_line":"    punc \u003d random.choice(puncs)"},{"line_number":72,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":73,"context_line":"    pre \u003d upper + digit + punc"},{"line_number":74,"context_line":"    password \u003d pre + \u0027\u0027.join(random.choice(seed) for x in range(length - 3))"},{"line_number":75,"context_line":"    return password"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_ddd36d37","line":72,"in_reply_to":"1aca2d91_46033710","updated":"2015-05-07 02:07:50.000000000","message":"Hi Sergey,\nThanks for your advice.\nThere is no configuration file for the tempest_lib project I think just because it is a common lib and it is transparent to user. Not sure if it is good to add a configuration file just for this scenario.\n\nHere is Matthew Treinish\u0027s suggestion\nhttps://bugs.launchpad.net/tempest/+bug/1448217\n\nI think it would be better to make a separate data_utils function to just generate a random password which meets all of these criteria you outlined instead of just passing a garbage input into random name.","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"6a8db19bc3a04f2b82b1c169e3eb361f97f67a08","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    digit \u003d random.choice(string.digits)"},{"line_number":70,"context_line":"    puncs \u003d \u0027~!@#$%^\u0026*_\u003d+\u0027"},{"line_number":71,"context_line":"    punc \u003d random.choice(puncs)"},{"line_number":72,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":73,"context_line":"    pre \u003d upper + digit + punc"},{"line_number":74,"context_line":"    password \u003d pre + \u0027\u0027.join(random.choice(seed) for x in range(length - 3))"},{"line_number":75,"context_line":"    return password"}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_04a3bf50","line":72,"in_reply_to":"1aca2d91_ddd36d37","updated":"2015-05-07 13:10:55.000000000","message":"Ok. But I can imagine a situation when some chars from \u0027punc\u0027 variable aren\u0027t enabled in password. It can cause unexpected test failures. I don\u0027t know how realistic this scenario is, but I think that some possibility of tuning will be useful here.","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"5b0c5e8d3fd95deee5ba8615420e0dfc79e65eed","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    puncs \u003d \u0027~!@#$%^\u0026*_\u003d+\u0027"},{"line_number":71,"context_line":"    punc \u003d random.choice(puncs)"},{"line_number":72,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":73,"context_line":"    pre \u003d upper + digit + punc"},{"line_number":74,"context_line":"    password \u003d pre + \u0027\u0027.join(random.choice(seed) for x in range(length - 3))"},{"line_number":75,"context_line":"    return password"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_699c84c0","line":73,"updated":"2015-05-07 15:20:37.000000000","message":"I see what you did there :) (you have the ldap rule enforcing that right?)","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":9479,"name":"yuxingw","email":"yuxingw@cn.ibm.com","username":"yuxingw"},"change_message_id":"55d0db621cd535dae7e2ad3772579a08fc5483d5","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    puncs \u003d \u0027~!@#$%^\u0026*_\u003d+\u0027"},{"line_number":71,"context_line":"    punc \u003d random.choice(puncs)"},{"line_number":72,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":73,"context_line":"    pre \u003d upper + digit + punc"},{"line_number":74,"context_line":"    password \u003d pre + \u0027\u0027.join(random.choice(seed) for x in range(length - 3))"},{"line_number":75,"context_line":"    return password"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1aca2d91_e54f74bb","line":73,"in_reply_to":"1aca2d91_699c84c0","updated":"2015-05-08 13:36:25.000000000","message":"Yes, You are right :).","commit_id":"50a765c928f57cee5aa5ba0b49baa56effd40a0d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"a3023f0aba4f23d8499c5a25b278a750f8a0c28d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    ascii_char \u003d string.ascii_letters"},{"line_number":72,"context_line":"    digits \u003d string.digits"},{"line_number":73,"context_line":"    digit \u003d random.choice(string.digits)"},{"line_number":74,"context_line":"    puncs \u003d \u0027~!@#$%^\u0026*_\u003d+\u0027"},{"line_number":75,"context_line":"    punc \u003d random.choice(puncs)"},{"line_number":76,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":77,"context_line":"    pre \u003d upper + digit + punc"}],"source_content_type":"text/x-python","patch_set":20,"id":"5afe65bd_cd450b18","line":74,"updated":"2015-06-02 02:48:11.000000000","message":"Is this puncs very necessary?\nI guess(just my feeling) we will face a problem by passing the above chars to REST APIs and current puncs doesn\u0027t seems generic.\nIf removing this puncs, is the generated password too weak?","commit_id":"c5f28aaec1f5bfe2bcfed4a58928464f3b597b76"},{"author":{"_account_id":9479,"name":"yuxingw","email":"yuxingw@cn.ibm.com","username":"yuxingw"},"change_message_id":"71e699c5a038d7199cc75d2ea2c4d4fc49b24625","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    ascii_char \u003d string.ascii_letters"},{"line_number":72,"context_line":"    digits \u003d string.digits"},{"line_number":73,"context_line":"    digit \u003d random.choice(string.digits)"},{"line_number":74,"context_line":"    puncs \u003d \u0027~!@#$%^\u0026*_\u003d+\u0027"},{"line_number":75,"context_line":"    punc \u003d random.choice(puncs)"},{"line_number":76,"context_line":"    seed \u003d ascii_char + digits + puncs"},{"line_number":77,"context_line":"    pre \u003d upper + digit + punc"}],"source_content_type":"text/x-python","patch_set":20,"id":"5afe65bd_3fe284d6","line":74,"in_reply_to":"5afe65bd_cd450b18","updated":"2015-06-02 05:40:34.000000000","message":"Thanks.\nThose puncs is referred from the wiki page, I suppose it is generic,Like afazekas comments we can make it more stronger defaults in the future.\n\nhttp://en.wikipedia.org/wiki/Password_policy,\ninclusion of special characters, e.g. @, #, $ etc.\n\nI verified it via REST API against Juno build, it works well. Here are test result.\n\n2015-04-28 06:19:33.586 7937 DEBUG tempest.common.rest_client [-] Request (UsersV3TestJSON:test_user_update): 201 POST https://172.20.48.10:35357/v3/users 0.080s\n    Request - Headers: {\u0027Content-Type\u0027: \u0027application/json\u0027, \u0027Accept\u0027: \u0027application/json\u0027, \u0027X-Auth-Token\u0027: \u0027\u003comitted\u003e\u0027}\n    Body: {\"user\": {\"name\": \"user--597373330\", \"enabled\": false, \"email\": \"user--597373330@testmail.tm\", \n             \"default_project_id\": null,\n             \"password\": \"PLzqD^$)o9toS6V5\", \"domain_id\": \"default\", \"description\": \"user--597373330description\"}}\n\n\n    Response - Headers: {\u0027status\u0027: \u0027201\u0027, \u0027content-length\u0027: \u0027326\u0027, \u0027vary\u0027: \u0027X-Auth-Token\u0027, \u0027connection\u0027: \u0027close\u0027, \n               \u0027date\u0027: \u0027Tue, 28 Apr 2015 06:19:33 GMT\u0027, \u0027content-type\u0027: \u0027application/json\u0027}\n    Body: {\"user\": {\"email\": \"user--597373330@testmail.tm\", \"name\": \"user--597373330\", \n              \"links\": {\"self\": \"https://192.168.101.10:5000/v3/users/dd64398ac6f74288ba160367e37d0a4a\"},\n              \"domain_id\": \"default\", \"default_project_id\": null, \"enabled\": false, \n              \"id\": \"dd64398ac6f74288ba160367e37d0a4a\", \"description\": \"user--597373330description\"}}","commit_id":"c5f28aaec1f5bfe2bcfed4a58928464f3b597b76"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"7f7831bb06166cd3c198cfaccb9eb9267fdd88b7","unresolved":false,"context_lines":[{"line_number":60,"context_line":"def rand_password(length\u003d15):"},{"line_number":61,"context_line":"    \"\"\"Generate a random password"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :param int length: The length of password that you expect to set"},{"line_number":64,"context_line":"    :return: a random password. The format is"},{"line_number":65,"context_line":"             \u0027\u003crandom upper letter\u003e-\u003crandom number\u003e-\u003crandom special character\u003e"},{"line_number":66,"context_line":"              -\u003crandom ascii letters or digit characters or special symbols\u003e\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"5afe65bd_17baad6e","line":63,"updated":"2015-06-04 05:12:37.000000000","message":"Probably, we should write a document that we allow the minimum number of the length.\nBut we will be able to add it after merging.","commit_id":"0e0d39d40be762a26319d65e3458cf8640aa49ce"}],"tempest_lib/tests/common/utils/test_data_utils.py":[{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"6b7fdaa0e0b0dc88946be704b01b4bfac8923456","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.assertIsInstance(actual, str)"},{"line_number":62,"context_line":"        self.assertRegexpMatches(actual, \"[A-Za-z0-9!@#$%^\u0026*()]{15,}\")"},{"line_number":63,"context_line":"        actual2 \u003d data_utils.rand_password()"},{"line_number":64,"context_line":"        self.assertNotEqual(actual, actual2)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test_rand_url(self):"},{"line_number":67,"context_line":"        actual \u003d data_utils.rand_url()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3acd31a7_a75e70e7","line":64,"updated":"2015-04-30 10:01:52.000000000","message":"Length parameter is not tested, but looks like it should be)","commit_id":"c83982daae7b45662b9b50c015bd110161ba7172"},{"author":{"_account_id":9479,"name":"yuxingw","email":"yuxingw@cn.ibm.com","username":"yuxingw"},"change_message_id":"5701fda212e04f7304b8712fe625be729e651559","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.assertIsInstance(actual, str)"},{"line_number":62,"context_line":"        self.assertRegexpMatches(actual, \"[A-Za-z0-9!@#$%^\u0026*()]{15,}\")"},{"line_number":63,"context_line":"        actual2 \u003d data_utils.rand_password()"},{"line_number":64,"context_line":"        self.assertNotEqual(actual, actual2)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test_rand_url(self):"},{"line_number":67,"context_line":"        actual \u003d data_utils.rand_url()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3acd31a7_64172ba4","line":64,"in_reply_to":"3acd31a7_a75e70e7","updated":"2015-05-08 13:57:34.000000000","message":"Added the related test case for length parameter. Thanks","commit_id":"c83982daae7b45662b9b50c015bd110161ba7172"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"378350c8fedd16131c2576668394b9e9e3b2b816","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def test_rand_password_with_len(self):"},{"line_number":67,"context_line":"        actual \u003d data_utils.rand_password(8)"},{"line_number":68,"context_line":"        self.assertIsInstance(actual, str)"},{"line_number":69,"context_line":"        self.assertRegexpMatches(actual, \"[A-Za-z0-9!@#$%^\u0026*()]{8,}\")"},{"line_number":70,"context_line":"        actual2 \u003d data_utils.rand_password(8)"},{"line_number":71,"context_line":"        self.assertNotEqual(actual, actual2)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_ca360903","line":69,"updated":"2015-04-30 14:38:03.000000000","message":"You could be a bit stricter here by replacing \u0027{8,}\u0027 by just \u0027{8}\u0027, ie remove the comma.","commit_id":"3e89912ac005d48c1eed046ed85f40a1938ab911"},{"author":{"_account_id":9479,"name":"yuxingw","email":"yuxingw@cn.ibm.com","username":"yuxingw"},"change_message_id":"39713a2d60f0f24a223bcd49b46521d1d10c9438","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def test_rand_password_with_len(self):"},{"line_number":67,"context_line":"        actual \u003d data_utils.rand_password(8)"},{"line_number":68,"context_line":"        self.assertIsInstance(actual, str)"},{"line_number":69,"context_line":"        self.assertRegexpMatches(actual, \"[A-Za-z0-9!@#$%^\u0026*()]{8,}\")"},{"line_number":70,"context_line":"        actual2 \u003d data_utils.rand_password(8)"},{"line_number":71,"context_line":"        self.assertNotEqual(actual, actual2)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_ede9df1b","line":69,"in_reply_to":"3acd31a7_ca360903","updated":"2015-05-08 13:57:52.000000000","message":"Done","commit_id":"3e89912ac005d48c1eed046ed85f40a1938ab911"}]}
