)]}'
{"nova/api/openstack/common.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"78205d465c2a8462000de6a6412d1d9fd9fff378","unresolved":false,"context_lines":[{"line_number":400,"context_line":"    return inner"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"def url_join(*parts):"},{"line_number":404,"context_line":"    \"\"\"Convenience method for joining parts of a URL. Any leading and trailing"},{"line_number":405,"context_line":"    \u0027/\u0027 characters are removed, and the the parts joined together with \u0027/\u0027 as a"},{"line_number":406,"context_line":"    separator."}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_f773897e","line":403,"updated":"2015-08-28 14:42:19.000000000","message":"There isn\u0027t a utility or library in python somewhere that will already do this for us, like urlparse,urllib, etc?","commit_id":"0933b9d7afdbc0288b0241368ba7792d6fb9cb6f"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"b5980f5f5a7203d3227db3d0f10de2664b6bc3df","unresolved":false,"context_lines":[{"line_number":400,"context_line":"    return inner"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"def url_join(*parts):"},{"line_number":404,"context_line":"    \"\"\"Convenience method for joining parts of a URL. Any leading and trailing"},{"line_number":405,"context_line":"    \u0027/\u0027 characters are removed, and the the parts joined together with \u0027/\u0027 as a"},{"line_number":406,"context_line":"    separator."}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_6306d7cf","line":403,"in_reply_to":"da20952f_f773897e","updated":"2015-08-28 15:55:12.000000000","message":"urlparse is the typical python module for url manipulation, but the rejoining methods require that the pieces be created using urlparse.urlparse() or urlparse.urlsplit(). IOW, they won\u0027t work with random bits, as we have in this module. The code could be modified to be compatible with urlparse, but that would be a much bigger change.","commit_id":"0933b9d7afdbc0288b0241368ba7792d6fb9cb6f"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"42115e23cf96b3276871b2295bed16b6a8f04f82","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        LOG.debug(\u0027href %s does not contain version\u0027 % href)"},{"line_number":303,"context_line":"        raise ValueError(_(\u0027href %s does not contain version\u0027) % href)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    new_path \u003d url_join(*url_parts)"},{"line_number":306,"context_line":"    parsed_url \u003d list(parsed_url)"},{"line_number":307,"context_line":"    parsed_url[2] \u003d new_path"},{"line_number":308,"context_line":"    return urlparse.urlunsplit(parsed_url)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_6bbf3b61","line":305,"updated":"2015-09-17 20:08:37.000000000","message":"is it a related change? seems you only mentioned os.path.join","commit_id":"788a8ef2170f2e4f74338c5b6b1be873362a47ce"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"a616247826a117c6ea3845b2a0ae2362f6076742","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        LOG.debug(\u0027href %s does not contain version\u0027 % href)"},{"line_number":303,"context_line":"        raise ValueError(_(\u0027href %s does not contain version\u0027) % href)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    new_path \u003d url_join(*url_parts)"},{"line_number":306,"context_line":"    parsed_url \u003d list(parsed_url)"},{"line_number":307,"context_line":"    parsed_url[2] \u003d new_path"},{"line_number":308,"context_line":"    return urlparse.urlunsplit(parsed_url)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_c223afbb","line":305,"in_reply_to":"ba15a1d1_6bbf3b61","updated":"2015-09-18 13:08:32.000000000","message":"The emphasis is on using url_join to join URLs, not replacing os.path.join. IMO this is sufficiently related.","commit_id":"788a8ef2170f2e4f74338c5b6b1be873362a47ce"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"a616247826a117c6ea3845b2a0ae2362f6076742","unresolved":false,"context_lines":[{"line_number":402,"context_line":""},{"line_number":403,"context_line":"def url_join(*parts):"},{"line_number":404,"context_line":"    \"\"\"Convenience method for joining parts of a URL. Any leading and trailing"},{"line_number":405,"context_line":"    \u0027/\u0027 characters are removed, and the the parts joined together with \u0027/\u0027 as a"},{"line_number":406,"context_line":"    separator."},{"line_number":407,"context_line":"    \"\"\""},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_c20acf25","line":405,"range":{"start_line":405,"start_character":36,"end_line":405,"end_character":39},"updated":"2015-09-18 13:08:32.000000000","message":"nit: \"the the\". Also an Oxford comma!","commit_id":"788a8ef2170f2e4f74338c5b6b1be873362a47ce"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"14d3c8e9806da0ca3920718ca99aae1e001ab4a2","unresolved":false,"context_lines":[{"line_number":402,"context_line":""},{"line_number":403,"context_line":"def url_join(*parts):"},{"line_number":404,"context_line":"    \"\"\"Convenience method for joining parts of a URL. Any leading and trailing"},{"line_number":405,"context_line":"    \u0027/\u0027 characters are removed, and the the parts joined together with \u0027/\u0027 as a"},{"line_number":406,"context_line":"    separator."},{"line_number":407,"context_line":"    \"\"\""},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_98dbdf7b","line":405,"range":{"start_line":405,"start_character":36,"end_line":405,"end_character":43},"updated":"2015-09-18 15:48:27.000000000","message":"nit: the the","commit_id":"2b27c7b230ac57ac5b579eb5fc6048228685fd76"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"a8ddafdd318e85f7af8befc5f2da4410111a3a09","unresolved":false,"context_lines":[{"line_number":406,"context_line":"    separator."},{"line_number":407,"context_line":"    \"\"\""},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"},{"line_number":409,"context_line":"    if not parts[-1]:"},{"line_number":410,"context_line":"        # Empty last element should add a trailing slash"},{"line_number":411,"context_line":"        clean_parts.append(\"\")"},{"line_number":412,"context_line":"    return \"/\".join(clean_parts)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_7c9336fb","line":409,"updated":"2015-09-25 05:27:37.000000000","message":"Maybe you should consider a case of an empty list.","commit_id":"2b27c7b230ac57ac5b579eb5fc6048228685fd76"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"c87a8da6666a66eaf177f6e29a02226f3906511f","unresolved":false,"context_lines":[{"line_number":406,"context_line":"    separator."},{"line_number":407,"context_line":"    \"\"\""},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"},{"line_number":409,"context_line":"    if not parts[-1]:"},{"line_number":410,"context_line":"        # Empty last element should add a trailing slash"},{"line_number":411,"context_line":"        clean_parts.append(\"\")"},{"line_number":412,"context_line":"    return \"/\".join(clean_parts)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_b383ef55","line":409,"in_reply_to":"9a1a9d01_7c9336fb","updated":"2015-09-28 14:11:00.000000000","message":"OK, good point. Done.","commit_id":"2b27c7b230ac57ac5b579eb5fc6048228685fd76"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"a6d07f67c60e08612c2ab4d6d627720ec4064970","unresolved":false,"context_lines":[{"line_number":301,"context_line":"        LOG.debug(\u0027href %s does not contain version\u0027 % href)"},{"line_number":302,"context_line":"        raise ValueError(_(\u0027href %s does not contain version\u0027) % href)"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    new_path \u003d url_join(*url_parts)"},{"line_number":305,"context_line":"    parsed_url \u003d list(parsed_url)"},{"line_number":306,"context_line":"    parsed_url[2] \u003d new_path"},{"line_number":307,"context_line":"    return urlparse.urlunsplit(parsed_url)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a2fa921_3525d1ad","line":304,"updated":"2015-10-12 16:30:55.000000000","message":"Why not\n\n\u0027/\u0027.join(s.strip(\u0027/\u0027) for s in pieces)\n\n?","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bdd780ad6ffd87479028b13afd386e4cc1325ddd","unresolved":false,"context_lines":[{"line_number":301,"context_line":"        LOG.debug(\u0027href %s does not contain version\u0027 % href)"},{"line_number":302,"context_line":"        raise ValueError(_(\u0027href %s does not contain version\u0027) % href)"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    new_path \u003d url_join(*url_parts)"},{"line_number":305,"context_line":"    parsed_url \u003d list(parsed_url)"},{"line_number":306,"context_line":"    parsed_url[2] \u003d new_path"},{"line_number":307,"context_line":"    return urlparse.urlunsplit(parsed_url)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_73f4245a","line":304,"in_reply_to":"7a2fa921_3525d1ad","updated":"2015-12-08 17:40:03.000000000","message":"See the comments on the url_join() function for technical reasons. But since this is needed in several places, it makes sense to have a single way to do it.","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"ec1c0bf982fbfdf8c813b887780ec5f35a5900df","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"def url_join(*parts):"},{"line_number":403,"context_line":"    \"\"\"Convenience method for joining parts of a URL. Any leading and trailing"},{"line_number":404,"context_line":"    \u0027/\u0027 characters are removed, and the parts joined together with \u0027/\u0027 as a"},{"line_number":405,"context_line":"    separator."},{"line_number":406,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_fa0cf93c","line":403,"updated":"2015-12-04 16:11:28.000000000","message":"nit: docstring should start with one line summary - http://docs.openstack.org/developer/hacking/\n\nclearly not enforced though","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bdd780ad6ffd87479028b13afd386e4cc1325ddd","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"def url_join(*parts):"},{"line_number":403,"context_line":"    \"\"\"Convenience method for joining parts of a URL. Any leading and trailing"},{"line_number":404,"context_line":"    \u0027/\u0027 characters are removed, and the parts joined together with \u0027/\u0027 as a"},{"line_number":405,"context_line":"    separator."},{"line_number":406,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_f37574ca","line":403,"in_reply_to":"7a740942_a7e9edb8","updated":"2015-12-08 17:40:03.000000000","message":"Done","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"730da060b577ae447dfa22954497ec1b9e5ca3bb","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"def url_join(*parts):"},{"line_number":403,"context_line":"    \"\"\"Convenience method for joining parts of a URL. Any leading and trailing"},{"line_number":404,"context_line":"    \u0027/\u0027 characters are removed, and the parts joined together with \u0027/\u0027 as a"},{"line_number":405,"context_line":"    separator."},{"line_number":406,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_a7e9edb8","line":403,"in_reply_to":"7a740942_fa0cf93c","updated":"2015-12-08 15:26:11.000000000","message":"Yeah. I\u0027m not sure why hacking isn\u0027t complaining about this, because I think it\u0027s supposed to.","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":12455,"name":"bharaththiruveedula","email":"bharath_ves@hotmail.com","username":"bharaththiruveedula"},"change_message_id":"196cebea0df2d3f31ea417a1242794f09c77681b","unresolved":false,"context_lines":[{"line_number":405,"context_line":"    separator."},{"line_number":406,"context_line":"    \"\"\""},{"line_number":407,"context_line":"    parts \u003d parts or [\"\"]"},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"},{"line_number":409,"context_line":"    if not parts[-1]:"},{"line_number":410,"context_line":"        # Empty last element should add a trailing slash"},{"line_number":411,"context_line":"        clean_parts.append(\"\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_6c5e1b14","line":408,"updated":"2015-11-09 17:03:14.000000000","message":"Why can\u0027t we write just this\n\"clean_parts \u003d [part.strip(\"/\") for part in parts]\"\nand there is no need of \u0027if\u0027 condition  below,if we use this code.","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"730da060b577ae447dfa22954497ec1b9e5ca3bb","unresolved":false,"context_lines":[{"line_number":405,"context_line":"    separator."},{"line_number":406,"context_line":"    \"\"\""},{"line_number":407,"context_line":"    parts \u003d parts or [\"\"]"},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"},{"line_number":409,"context_line":"    if not parts[-1]:"},{"line_number":410,"context_line":"        # Empty last element should add a trailing slash"},{"line_number":411,"context_line":"        clean_parts.append(\"\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_a7ad6d9c","line":408,"in_reply_to":"7a740942_1b743dcd","updated":"2015-12-08 15:26:11.000000000","message":"The if filters out empty elements, which seems reasonable for canonicalization.","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"23bb726bcd2c2e5e6bbb62c35fc743b1e2a9cf90","unresolved":false,"context_lines":[{"line_number":405,"context_line":"    separator."},{"line_number":406,"context_line":"    \"\"\""},{"line_number":407,"context_line":"    parts \u003d parts or [\"\"]"},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"},{"line_number":409,"context_line":"    if not parts[-1]:"},{"line_number":410,"context_line":"        # Empty last element should add a trailing slash"},{"line_number":411,"context_line":"        clean_parts.append(\"\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_1b743dcd","line":408,"in_reply_to":"da85f559_6c5e1b14","updated":"2015-12-07 06:15:19.000000000","message":"Same question. I don\u0027t think we need the trailing \u0027if part\u0027","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"23bb726bcd2c2e5e6bbb62c35fc743b1e2a9cf90","unresolved":false,"context_lines":[{"line_number":406,"context_line":"    \"\"\""},{"line_number":407,"context_line":"    parts \u003d parts or [\"\"]"},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"},{"line_number":409,"context_line":"    if not parts[-1]:"},{"line_number":410,"context_line":"        # Empty last element should add a trailing slash"},{"line_number":411,"context_line":"        clean_parts.append(\"\")"},{"line_number":412,"context_line":"    return \"/\".join(clean_parts)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_bb308902","line":409,"updated":"2015-12-07 06:15:19.000000000","message":"More readable:\n\n if parts[-1] \u003d\u003d \"\":","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"730da060b577ae447dfa22954497ec1b9e5ca3bb","unresolved":false,"context_lines":[{"line_number":406,"context_line":"    \"\"\""},{"line_number":407,"context_line":"    parts \u003d parts or [\"\"]"},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"},{"line_number":409,"context_line":"    if not parts[-1]:"},{"line_number":410,"context_line":"        # Empty last element should add a trailing slash"},{"line_number":411,"context_line":"        clean_parts.append(\"\")"},{"line_number":412,"context_line":"    return \"/\".join(clean_parts)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_07f1e1cc","line":409,"in_reply_to":"7a740942_bb308902","updated":"2015-12-08 15:26:11.000000000","message":"I like it the way it is.","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"23bb726bcd2c2e5e6bbb62c35fc743b1e2a9cf90","unresolved":false,"context_lines":[{"line_number":407,"context_line":"    parts \u003d parts or [\"\"]"},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"},{"line_number":409,"context_line":"    if not parts[-1]:"},{"line_number":410,"context_line":"        # Empty last element should add a trailing slash"},{"line_number":411,"context_line":"        clean_parts.append(\"\")"},{"line_number":412,"context_line":"    return \"/\".join(clean_parts)"},{"line_number":413,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_db547522","line":410,"updated":"2015-12-07 06:15:19.000000000","message":"This can be added to the docstring I think..","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bdd780ad6ffd87479028b13afd386e4cc1325ddd","unresolved":false,"context_lines":[{"line_number":407,"context_line":"    parts \u003d parts or [\"\"]"},{"line_number":408,"context_line":"    clean_parts \u003d [part.strip(\"/\") for part in parts if part]"},{"line_number":409,"context_line":"    if not parts[-1]:"},{"line_number":410,"context_line":"        # Empty last element should add a trailing slash"},{"line_number":411,"context_line":"        clean_parts.append(\"\")"},{"line_number":412,"context_line":"    return \"/\".join(clean_parts)"},{"line_number":413,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_333d3cdd","line":410,"in_reply_to":"7a740942_db547522","updated":"2015-12-08 17:40:03.000000000","message":"Done","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"}],"nova/api/openstack/compute/views/versions.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4e75216fc321b761288795404d0b5b8eaf4aabee","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            path \u003d path.strip(\u0027/\u0027)"},{"line_number":96,"context_line":"            return common.url_join(self.prefix, version_number, path)"},{"line_number":97,"context_line":"        else:"},{"line_number":98,"context_line":"            return common.url_join(self.prefix, version_number) + \u0027/\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_0246877a","line":98,"updated":"2015-09-18 13:10:39.000000000","message":"this can be common.url_join(self.prefix, version_number, \u0027\u0027)?","commit_id":"788a8ef2170f2e4f74338c5b6b1be873362a47ce"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"a616247826a117c6ea3845b2a0ae2362f6076742","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            path \u003d path.strip(\u0027/\u0027)"},{"line_number":96,"context_line":"            return common.url_join(self.prefix, version_number, path)"},{"line_number":97,"context_line":"        else:"},{"line_number":98,"context_line":"            return common.url_join(self.prefix, version_number) + \u0027/\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_9d44384a","line":98,"range":{"start_line":98,"start_character":62,"end_line":98,"end_character":69},"updated":"2015-09-18 13:08:32.000000000","message":"why not use the \"empty final part\" here?","commit_id":"788a8ef2170f2e4f74338c5b6b1be873362a47ce"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"d592fa6d6462b3d476a2b837ddacc95f333e25c0","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            path \u003d path.strip(\u0027/\u0027)"},{"line_number":96,"context_line":"            return common.url_join(self.prefix, version_number, path)"},{"line_number":97,"context_line":"        else:"},{"line_number":98,"context_line":"            return common.url_join(self.prefix, version_number) + \u0027/\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_5d75402f","line":98,"in_reply_to":"ba15a1d1_0246877a","updated":"2015-09-18 13:16:12.000000000","message":"yes exactly","commit_id":"788a8ef2170f2e4f74338c5b6b1be873362a47ce"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"c8f61d470ab088e995d258b3e4d319730766741b","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            path \u003d path.strip(\u0027/\u0027)"},{"line_number":96,"context_line":"            return common.url_join(self.prefix, version_number, path)"},{"line_number":97,"context_line":"        else:"},{"line_number":98,"context_line":"            return common.url_join(self.prefix, version_number) + \u0027/\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_d2b5b6ec","line":98,"in_reply_to":"ba15a1d1_5d75402f","updated":"2015-09-18 15:18:39.000000000","message":"Sure, that can simplify the method. I just did a search/replace for os.path.join, but I\u0027ll clean this up.","commit_id":"788a8ef2170f2e4f74338c5b6b1be873362a47ce"},{"author":{"_account_id":10224,"name":"Feodor Tersin","email":"ftersin@hotmail.com","username":"ftersin"},"change_message_id":"a8ddafdd318e85f7af8befc5f2da4410111a3a09","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        else:"},{"line_number":92,"context_line":"            version_number \u003d \u0027v2\u0027"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        path \u003d path or \u0027\u0027"},{"line_number":95,"context_line":"        return common.url_join(self.prefix, version_number, path)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_372cf949","line":94,"updated":"2015-09-25 05:27:37.000000000","message":"\"path or \u0027/\u0027\" would be more clear for me","commit_id":"2b27c7b230ac57ac5b579eb5fc6048228685fd76"}],"nova/tests/unit/api/openstack/test_common.py":[{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"23bb726bcd2c2e5e6bbb62c35fc743b1e2a9cf90","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        pieces \u003d [\"one\", \"two\", \"three\", \"\"]"},{"line_number":595,"context_line":"        joined \u003d common.url_join(*pieces)"},{"line_number":596,"context_line":"        self.assertEqual(\"one/two/three/\", joined)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":""},{"line_number":599,"context_line":"class ViewBuilderLinkTest(test.NoDBTestCase):"},{"line_number":600,"context_line":"    project_id \u003d \"fake\""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_7e00cf01","line":597,"updated":"2015-12-07 06:15:19.000000000","message":"maybe add tests when 1. parts is [] 2. parts is [\"\"]?","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bdd780ad6ffd87479028b13afd386e4cc1325ddd","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        pieces \u003d [\"one\", \"two\", \"three\", \"\"]"},{"line_number":595,"context_line":"        joined \u003d common.url_join(*pieces)"},{"line_number":596,"context_line":"        self.assertEqual(\"one/two/three/\", joined)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":""},{"line_number":599,"context_line":"class ViewBuilderLinkTest(test.NoDBTestCase):"},{"line_number":600,"context_line":"    project_id \u003d \"fake\""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_996bf184","line":597,"in_reply_to":"7a740942_7e00cf01","updated":"2015-12-08 17:40:03.000000000","message":"Done. Also added 3. parts is [\"/\"]","commit_id":"eb8213c27371e550a940659b5d4f162b4a216a37"}]}
