)]}'
{"swiftclient/shell.py":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"f31cde79e584caaa8de6c7bd80d8a42fcaa0002c","unresolved":false,"context_lines":[{"line_number":1305,"context_line":""},{"line_number":1306,"context_line":"    # Short circuit for tempurl, which doesn\u0027t need auth"},{"line_number":1307,"context_line":"    if len(args) \u003e 0 and args[0] \u003d\u003d \u0027tempurl\u0027:"},{"line_number":1308,"context_line":"        return options, args"},{"line_number":1309,"context_line":""},{"line_number":1310,"context_line":"    if (not (options.auth and options.user and options.key)):"},{"line_number":1311,"context_line":"        # Use 2.0 auth if none of the old args are present"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_8473197f","line":1308,"updated":"2014-07-11 18:00:42.000000000","message":"Nice idea, like it!","commit_id":"e0261d867f1326be1def55dabdaa5f7acef898b3"}],"swiftclient/utils.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1a2c7ccc424dc1149ca79fdfd31de4f6f5b1a75d","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    if set(methods) - set(allowable_methods):"},{"line_number":97,"context_line":"        raise ValueError(\u0027Only allowable HTTP methods are: %s\u0027 %"},{"line_number":98,"context_line":"                         allowable_methods)"},{"line_number":99,"context_line":"    hmac_body \u003d \u0027\\n\u0027.join([\" \".join(methods), str(expiration), path])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    # Encode to UTF-8 for py3 compatibility"},{"line_number":102,"context_line":"    sig \u003d hmac.new(key.encode(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_aad33d5d","line":99,"updated":"2014-06-27 23:12:38.000000000","message":"Fairly certain that only one HTTP method can be used here (which coincidentally simplifies this code).","commit_id":"9d9a3476fed186df7950139d1d57ae53911d973c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"becb1567c24c348e4db269f24a49d52f562a49df","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    if set(methods) - set(allowable_methods):"},{"line_number":97,"context_line":"        raise ValueError(\u0027Only allowable HTTP methods are: %s\u0027 %"},{"line_number":98,"context_line":"                         allowable_methods)"},{"line_number":99,"context_line":"    hmac_body \u003d \u0027\\n\u0027.join([\" \".join(methods), str(expiration), path])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    # Encode to UTF-8 for py3 compatibility"},{"line_number":102,"context_line":"    sig \u003d hmac.new(key.encode(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_bf2438c7","line":99,"in_reply_to":"1ae5cdf2_aad33d5d","updated":"2014-06-30 18:41:59.000000000","message":"Done. Yeah, must have misread documentation on methods.","commit_id":"9d9a3476fed186df7950139d1d57ae53911d973c"},{"author":{"_account_id":7680,"name":"Alex Gaynor","email":"alex.gaynor@gmail.com","username":"alex_gaynor"},"change_message_id":"d913f639fc6e7c15fac0a17fdb4fd34b8fb04d75","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import hmac"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"TRUE_VALUES \u003d set((\u0027true\u0027, \u00271\u0027, \u0027yes\u0027, \u0027on\u0027, \u0027t\u0027, \u0027y\u0027))"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_9503d372","line":20,"updated":"2014-06-30 18:44:31.000000000","message":"this import should be in the previous group; time is a stdlib module, and six is an external lib.","commit_id":"9aab59d188ce3517c7df41fae6437989c171fd91"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"a832d9fc166b1befd1ea6fbcdc186c7f8b2b2965","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import hmac"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"TRUE_VALUES \u003d set((\u0027true\u0027, \u00271\u0027, \u0027yes\u0027, \u0027on\u0027, \u0027t\u0027, \u0027y\u0027))"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_d550eb60","line":20,"in_reply_to":"baada198_9503d372","updated":"2014-06-30 18:47:41.000000000","message":"Oh duh. Fixed.","commit_id":"9aab59d188ce3517c7df41fae6437989c171fd91"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"f2028cd0831c77e4fc14c84c0db233f7c810c9c3","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    except TypeError:"},{"line_number":88,"context_line":"        raise TypeError(\u0027seconds must be an integer\u0027)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    allowable_methods \u003d [\u0027GET\u0027, \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027]"},{"line_number":91,"context_line":"    if method.upper() not in allowable_methods:"},{"line_number":92,"context_line":"        raise ValueError(\u0027Only allowable HTTP methods are: %s\u0027 %"},{"line_number":93,"context_line":"                         allowable_methods)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_3703b974","line":90,"updated":"2014-07-09 19:44:33.000000000","message":"HEAD is missing","commit_id":"6d8bb6c887a1936f7bb7783d1c7df97278a3ceec"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"562319c0ff22f6297acf581511a1fd1cb1d6ca2f","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    except TypeError:"},{"line_number":88,"context_line":"        raise TypeError(\u0027seconds must be an integer\u0027)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    allowable_methods \u003d [\u0027GET\u0027, \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027]"},{"line_number":91,"context_line":"    if method.upper() not in allowable_methods:"},{"line_number":92,"context_line":"        raise ValueError(\u0027Only allowable HTTP methods are: %s\u0027 %"},{"line_number":93,"context_line":"                         allowable_methods)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_030ac220","line":90,"in_reply_to":"baada198_32b027f4","updated":"2014-07-11 00:57:41.000000000","message":"I\u0027ll switch it to just a warning. I do want to keep something to help with debugging, because the wrong method returns a 401, which may be confused with actually being unauthorized (wrong key or something).\n\nHeh BREW. I agree, I don\u0027t want to be the one between a developer and their coffee.","commit_id":"6d8bb6c887a1936f7bb7783d1c7df97278a3ceec"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"562319c0ff22f6297acf581511a1fd1cb1d6ca2f","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    except TypeError:"},{"line_number":88,"context_line":"        raise TypeError(\u0027seconds must be an integer\u0027)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    allowable_methods \u003d [\u0027GET\u0027, \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027]"},{"line_number":91,"context_line":"    if method.upper() not in allowable_methods:"},{"line_number":92,"context_line":"        raise ValueError(\u0027Only allowable HTTP methods are: %s\u0027 %"},{"line_number":93,"context_line":"                         allowable_methods)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_e81bed7d","line":90,"in_reply_to":"baada198_3703b974","updated":"2014-07-11 00:57:41.000000000","message":"Ahh good point. HEAD is implicitly allowed if you use GET or PUT, but apparently you can allow only HEAD. Cool. Fixed.","commit_id":"6d8bb6c887a1936f7bb7783d1c7df97278a3ceec"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"b5790b6736018a287d57f2b0fe705fdf560644b5","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    except TypeError:"},{"line_number":88,"context_line":"        raise TypeError(\u0027seconds must be an integer\u0027)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    allowable_methods \u003d [\u0027GET\u0027, \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027]"},{"line_number":91,"context_line":"    if method.upper() not in allowable_methods:"},{"line_number":92,"context_line":"        raise ValueError(\u0027Only allowable HTTP methods are: %s\u0027 %"},{"line_number":93,"context_line":"                         allowable_methods)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_32b027f4","line":90,"in_reply_to":"baada198_3703b974","updated":"2014-07-09 19:51:33.000000000","message":"I wonder, do we even need this list? The tempurl middleware already has a configurable list of methods it\u0027ll allow; having a list here just increases the likelihood that we\u0027ll have to expand it later.\n\nMaybe it\u0027d be good to emit a warning if the verb isn\u0027t in the list of known verbs, but if someone puts middleware in their Swift cluster that supports PATCH (RFC 5789) or BREW (RFC 2324) or whatever, I don\u0027t want swiftclient to prevent them from making coffee.","commit_id":"6d8bb6c887a1936f7bb7783d1c7df97278a3ceec"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"dc6e1f47674fbfaa251908db22db0f2205344296","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    :param method: A HTTP method, typically either GET or PUT, to allow for"},{"line_number":78,"context_line":"    this temporary URL."},{"line_number":79,"context_line":"    :raises: ValueError if seconds is not a positive integer or if no or"},{"line_number":80,"context_line":"    invalid HTTP methods are provided."},{"line_number":81,"context_line":"    :raises: TypeError if seconds is not an integer"},{"line_number":82,"context_line":"    :return: the path portion of a temporary URL"},{"line_number":83,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_cb1d3964","line":80,"updated":"2014-07-11 07:52:48.000000000","message":"You need to update the description, the ValueErrors is no longer raised when an invalid HTTP method is provided","commit_id":"1abd7a6397ec8b1ee2a8b597ef74a16a2dd50daa"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e6408256d8c5122399b4029691dbb824abde7b59","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    :param method: A HTTP method, typically either GET or PUT, to allow for"},{"line_number":78,"context_line":"    this temporary URL."},{"line_number":79,"context_line":"    :raises: ValueError if seconds is not a positive integer or if no or"},{"line_number":80,"context_line":"    invalid HTTP methods are provided."},{"line_number":81,"context_line":"    :raises: TypeError if seconds is not an integer"},{"line_number":82,"context_line":"    :return: the path portion of a temporary URL"},{"line_number":83,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_21323f5f","line":80,"in_reply_to":"baada198_cb1d3964","updated":"2014-07-11 17:52:39.000000000","message":"Done","commit_id":"1abd7a6397ec8b1ee2a8b597ef74a16a2dd50daa"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"dc6e1f47674fbfaa251908db22db0f2205344296","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    except TypeError:"},{"line_number":89,"context_line":"        raise TypeError(\u0027seconds must be an integer\u0027)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    allowable_methods \u003d [\u0027GET\u0027, \u0027PUT\u0027, \u0027HEAD\u0027]"},{"line_number":92,"context_line":"    if method.upper() not in allowable_methods:"},{"line_number":93,"context_line":"        logger \u003d logging.getLogger(\"swiftclient\")"},{"line_number":94,"context_line":"        logger.warning(\u0027Non default HTTP method %s for tempurl specified\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_0bb01142","line":91,"updated":"2014-07-11 07:52:48.000000000","message":"POST and DELETE raise a warning now?","commit_id":"1abd7a6397ec8b1ee2a8b597ef74a16a2dd50daa"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e6408256d8c5122399b4029691dbb824abde7b59","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    except TypeError:"},{"line_number":89,"context_line":"        raise TypeError(\u0027seconds must be an integer\u0027)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    allowable_methods \u003d [\u0027GET\u0027, \u0027PUT\u0027, \u0027HEAD\u0027]"},{"line_number":92,"context_line":"    if method.upper() not in allowable_methods:"},{"line_number":93,"context_line":"        logger \u003d logging.getLogger(\"swiftclient\")"},{"line_number":94,"context_line":"        logger.warning(\u0027Non default HTTP method %s for tempurl specified\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_610fd788","line":91,"in_reply_to":"baada198_0bb01142","updated":"2014-07-11 17:52:39.000000000","message":"They\u0027re not in the default list, but yeah, I guess it doesn\u0027t make sense to warn for those.","commit_id":"1abd7a6397ec8b1ee2a8b597ef74a16a2dd50daa"}],"tests/unit/test_utils.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1a2c7ccc424dc1149ca79fdfd31de4f6f5b1a75d","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        expected_url \u003d (\u0027/v1/AUTH_account/c/o?temp_url_sig\u003d8b7af3f7f627321c41\u0027"},{"line_number":139,"context_line":"                        \u0027eaae4d13aa34123baa65d2\u0026temp_url_expires\u003d1395080670\u0027)"},{"line_number":140,"context_line":"        url \u003d u.generate_temp_url(self.url, self.seconds, self.key,"},{"line_number":141,"context_line":"                                  self.methods)"},{"line_number":142,"context_line":"        self.assertEqual(url, expected_url)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_generate_temp_url_bad_seconds(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_ea40e507","line":141,"updated":"2014-06-27 23:12:38.000000000","message":"I\u0027d rather mock out the hmac calls, so it\u0027s easy to see this test is correct.\n\nAlso, might be nice to use a more readable time number, maybe 1400000000. :)","commit_id":"9d9a3476fed186df7950139d1d57ae53911d973c"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"becb1567c24c348e4db269f24a49d52f562a49df","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        expected_url \u003d (\u0027/v1/AUTH_account/c/o?temp_url_sig\u003d8b7af3f7f627321c41\u0027"},{"line_number":139,"context_line":"                        \u0027eaae4d13aa34123baa65d2\u0026temp_url_expires\u003d1395080670\u0027)"},{"line_number":140,"context_line":"        url \u003d u.generate_temp_url(self.url, self.seconds, self.key,"},{"line_number":141,"context_line":"                                  self.methods)"},{"line_number":142,"context_line":"        self.assertEqual(url, expected_url)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_generate_temp_url_bad_seconds(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_f5c32f36","line":141,"in_reply_to":"1ae5cdf2_ea40e507","updated":"2014-06-30 18:41:59.000000000","message":"Done and done","commit_id":"9d9a3476fed186df7950139d1d57ae53911d973c"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"dc6e1f47674fbfaa251908db22db0f2205344296","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        super(TestTempURL, self).setUp()"},{"line_number":130,"context_line":"        self.url \u003d \u0027/v1/AUTH_account/c/o\u0027"},{"line_number":131,"context_line":"        self.seconds \u003d 3600"},{"line_number":132,"context_line":"        self.key \u003d \u0027correcthorsebatterystaple\u0027"},{"line_number":133,"context_line":"        self.method \u003d \u0027GET\u0027"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @mock.patch(\u0027hmac.HMAC.hexdigest\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_abef251d","line":132,"updated":"2014-07-11 07:52:48.000000000","message":"Like it, much easier to remember than \"Tr0ub4dor\u00263\" ;)","commit_id":"1abd7a6397ec8b1ee2a8b597ef74a16a2dd50daa"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e6408256d8c5122399b4029691dbb824abde7b59","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        super(TestTempURL, self).setUp()"},{"line_number":130,"context_line":"        self.url \u003d \u0027/v1/AUTH_account/c/o\u0027"},{"line_number":131,"context_line":"        self.seconds \u003d 3600"},{"line_number":132,"context_line":"        self.key \u003d \u0027correcthorsebatterystaple\u0027"},{"line_number":133,"context_line":"        self.method \u003d \u0027GET\u0027"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    @mock.patch(\u0027hmac.HMAC.hexdigest\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_81278b11","line":132,"in_reply_to":"baada198_abef251d","updated":"2014-07-11 17:52:39.000000000","message":":)","commit_id":"1abd7a6397ec8b1ee2a8b597ef74a16a2dd50daa"}]}
