)]}'
{"doc/manpages/swift.1":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":139,"context_line":"timestamp, using the date and time or only the date portion. If the ISO timestamp"},{"line_number":140,"context_line":"is used, the local timezone will be used for generating the expirary date, unless"},{"line_number":141,"context_line":"the timestamp ends with a \"Z\", which designates UTC time."},{"line_number":142,"context_line":"With the optional \\-\\-prefix\\-based option a"},{"line_number":143,"context_line":"prefix-based URL is generated. The option \\-\\-iso8601 provides ISO 8601 UTC timestamps"},{"line_number":144,"context_line":"instead of Unix timestamps inside the generated URL. If optional \\-\\-absolute argument is"},{"line_number":145,"context_line":"provided and the time argument is specified in seconds, the seconds are"}],"source_content_type":"text/troff","patch_set":3,"id":"3a461143_de36c3b3","line":142,"range":{"start_line":142,"start_character":9,"end_line":142,"end_character":17},"updated":"2017-01-25 20:14:38.000000000","message":"nit: this can be removed.","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"59a7aaf9018ccc829b70e1773c029d693e5e905d","unresolved":false,"context_lines":[{"line_number":136,"context_line":"at the given path, using the given HTTP method, for the given time,"},{"line_number":137,"context_line":"using the given TempURL key. The time can be specified either as an integer"},{"line_number":138,"context_line":"denoting the amount of seconds the temporary URL is valid, or as an ISO 8601"},{"line_number":139,"context_line":"timestamp in one of following formats:  Complete date: YYYY\\-MM-\\DD (eg 1997\\-07\\-16),"},{"line_number":140,"context_line":"complete date plus hours, minutes and seconds: YYYY\\-MM\\-DDThh:mm:ss"},{"line_number":141,"context_line":"(eg 1997\\-07\\-16T19:20:30) or complete date plus hours, minutes and seconds with"},{"line_number":142,"context_line":"UTC designator: YYYY\\-MM\\-DDThh:mm:ssZ (eg 1997\\-07\\-16T19:20:30Z). Be aware that"}],"source_content_type":"text/troff","patch_set":5,"id":"ba2be162_5103a6b8","line":139,"range":{"start_line":139,"start_character":55,"end_line":139,"end_character":86},"updated":"2017-02-28 17:58:18.000000000","message":"There\u0027s a formatting issue here when displaying with man.\n\nMaybe it should be: \"YYYY\\-MM\\-DD\"","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"59a7aaf9018ccc829b70e1773c029d693e5e905d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"provided and the time argument is specified in seconds, the seconds are"},{"line_number":149,"context_line":"interpreted as a Unix timestamp at which the URL"},{"line_number":150,"context_line":"should expire. \\fBExample\\fR: tempurl GET $(date \\-d \"Jan 1 2016\" +%s)"},{"line_number":151,"context_line":"/v1/AUTH_foo/bar_container/quux.md my_secret_tempurl_key \\-\\-absolute"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":".RE"},{"line_number":154,"context_line":""}],"source_content_type":"text/troff","patch_set":5,"id":"ba2be162_31e4720c","line":151,"updated":"2017-02-28 17:58:18.000000000","message":"I know it\u0027s just a nit, but while we are at it fixing the problem above, can we also fix the paragraph formatting too? I think it just needs to be broken up a bit more to make it more readable (similar to \u0027capabilities\u0027)\nHere\u0027s a suggestion: http://paste.openstack.org/show/600781/","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"}],"doc/source/cli.rst":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":235,"context_line":"       the amount of time the temporary URL will be valid for. ``time`` can be specified as an integer,"},{"line_number":236,"context_line":"       denoting the number of seconds from now on until the URL shall be valid; or, if ``--absolute``"},{"line_number":237,"context_line":"       is passed, the Unix timestamp when the temporary URL will expire. But, ``time`` can also be"},{"line_number":238,"context_line":"       specified as an ISO 8601 timestamp, specifying the full date and time part or only the date part"},{"line_number":239,"context_line":"       using ``:`` as a separator for the time and an optional ``Z`` at the end for designating UTC"},{"line_number":240,"context_line":"       time. Examples: ``2015-05-25T12:05:33`` or ``2015-05-25`` or ``2015-05-25T12:05:33Z`` or"},{"line_number":241,"context_line":"       ``2015-05-25Z``."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a461143_1e268b68","line":238,"range":{"start_line":238,"start_character":100,"end_line":238,"end_character":103},"updated":"2017-01-25 20:14:38.000000000","message":"nit: over 80? better to wrap around...","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":238,"context_line":"       specified as an ISO 8601 timestamp, specifying the full date and time part or only the date part"},{"line_number":239,"context_line":"       using ``:`` as a separator for the time and an optional ``Z`` at the end for designating UTC"},{"line_number":240,"context_line":"       time. Examples: ``2015-05-25T12:05:33`` or ``2015-05-25`` or ``2015-05-25T12:05:33Z`` or"},{"line_number":241,"context_line":"       ``2015-05-25Z``."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"       ``path`` option sets the full path to the Swift object."},{"line_number":244,"context_line":"       Example: ``/v1/AUTH_account/c/o``. ``key`` option is"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a461143_5ece5384","line":241,"range":{"start_line":241,"start_character":9,"end_line":241,"end_character":20},"updated":"2017-01-25 20:14:38.000000000","message":"I think it would be important to call out here and in the man file what time it will default to when only the date is provided","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"59a7aaf9018ccc829b70e1773c029d693e5e905d","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    ``tempurl [command-options] [method] [time] [path] [key]``"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"       Generates a temporary URL for a Swift object. ``method`` option sets an HTTP method to"},{"line_number":234,"context_line":"       allow for this temporary URL that is usually \u0027GET\u0027 or \u0027PUT\u0027. ``time`` option sets"},{"line_number":235,"context_line":"       the amount of time the temporary URL will be valid for."},{"line_number":236,"context_line":"       ``time`` can be specified as an integer, denoting the number of seconds"},{"line_number":237,"context_line":"       from now on until the URL shall be valid; or, if ``--absolute``"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_62fc5a3f","line":234,"range":{"start_line":234,"start_character":52,"end_line":234,"end_character":66},"updated":"2017-02-28 17:58:18.000000000","message":"I think you want:\n``GET`` or ``PUT``","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":17245,"name":"Christopher Bartz","email":"bartz@dkrz.de","username":"cbartz"},"change_message_id":"a460de020b360c344e014ccca4cdee4667fa3b72","unresolved":false,"context_lines":[{"line_number":239,"context_line":"       But beyond that, ``time`` can also be specified as an ISO 8601 timestamp"},{"line_number":240,"context_line":"       in one of following formats:"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        i) Complete date: YYYY-MM-DD (eg 1997-07-16)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        ii) Complete date plus hours, minutes and seconds:"},{"line_number":245,"context_line":"           YYYY-MM-DDThh:mm:ss"},{"line_number":246,"context_line":"         (eg 1997-07-16T19:20:30)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        iii) Complete date plus hours, minutes and seconds with UTC designator:"},{"line_number":249,"context_line":"            YYYY-MM-DDThh:mm:ssZ"},{"line_number":250,"context_line":"         (eg 1997-07-16T19:20:30Z)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"       Please be aware that if you use one of the formats 1. or 2.,"},{"line_number":253,"context_line":"       the timestamp is generated using your local timezone. If only a date is"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a430d35_287ffb66","line":250,"range":{"start_line":242,"start_character":6,"end_line":250,"end_character":34},"updated":"2017-02-07 18:36:30.000000000","message":"I copied this description from https://www.w3.org/TR/NOTE-datetime","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"59a7aaf9018ccc829b70e1773c029d693e5e905d","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            YYYY-MM-DDThh:mm:ssZ"},{"line_number":250,"context_line":"         (eg 1997-07-16T19:20:30Z)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"       Please be aware that if you use one of the formats 1. or 2.,"},{"line_number":253,"context_line":"       the timestamp is generated using your local timezone. If only a date is"},{"line_number":254,"context_line":"       specified, the time part used will equal to ``00:00:00``."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"       ``path`` option sets the full path to the Swift object."}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_9dfe0f04","line":253,"range":{"start_line":252,"start_character":7,"end_line":253,"end_character":60},"updated":"2017-02-28 17:58:18.000000000","message":"how about:\nPlease be aware that if you don\u0027t provide the UTC designator (i.e., Z) the timestamp is generated using your local timezone.","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"}],"swiftclient/shell.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"757b656311a1a250d938468759d8411aba9a5d6f","unresolved":false,"context_lines":[{"line_number":1222,"context_line":"        print(\u0027export OS_AUTH_TOKEN\u003d%s\u0027 % sh_quote(token))"},{"line_number":1223,"context_line":""},{"line_number":1224,"context_line":""},{"line_number":1225,"context_line":"st_tempurl_options \u003d \u0027\u0027\u0027[--absolute] [--prefix-based]"},{"line_number":1226,"context_line":"                     \u003cmethod\u003e \u003cseconds\u003e \u003cpath\u003e \u003ckey\u003e\u0027\u0027\u0027"},{"line_number":1227,"context_line":""},{"line_number":1228,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_5f02e4b4","line":1225,"range":{"start_line":1225,"start_character":37,"end_line":1225,"end_character":53},"updated":"2017-01-24 17:02:01.000000000","message":"need to add --iso8601 here","commit_id":"dfe4b3c0d5ca89797475b683edae2e8b09851a65"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"757b656311a1a250d938468759d8411aba9a5d6f","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"                        \"Temp-URL-Key:b3968d0207b54ece87cccc06515a89d4\"\\\u0027"},{"line_number":1244,"context_line":""},{"line_number":1245,"context_line":"Optional arguments:"},{"line_number":1246,"context_line":"  --absolute            Interpret the \u003cseconds\u003e positional argument as a Unix"},{"line_number":1247,"context_line":"                        timestamp rather than a number of seconds in the"},{"line_number":1248,"context_line":"                        future."},{"line_number":1249,"context_line":"  --prefix-based        If present, a prefix-based tempURL will be generated."}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_9ff0cc68","line":1246,"range":{"start_line":1246,"start_character":4,"end_line":1246,"end_character":12},"updated":"2017-01-24 17:02:01.000000000","message":"this is more of a RFE, but I think it would be great if user could pass in something like:\n\nswift tempurl GET 2017-01-25T00:00:00Z /v1/AUTH_test/c/o SECRET --iso8601 --absolute\n\nIt is also possible that in this particular use we might want to support the user providing something like: 2017-01-25 which would default to midnight UTC\n\nThoughts?","commit_id":"dfe4b3c0d5ca89797475b683edae2e8b09851a65"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"757b656311a1a250d938468759d8411aba9a5d6f","unresolved":false,"context_lines":[{"line_number":1247,"context_line":"                        timestamp rather than a number of seconds in the"},{"line_number":1248,"context_line":"                        future."},{"line_number":1249,"context_line":"  --prefix-based        If present, a prefix-based tempURL will be generated."},{"line_number":1250,"context_line":"  --iso8601             If present, the tempURL will contain an ISO 8601 UTC"},{"line_number":1251,"context_line":"                        timestamp instead of a Unix timestamp."},{"line_number":1252,"context_line":"\u0027\u0027\u0027.strip(\u0027\\n\u0027)"},{"line_number":1253,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_1fd13c23","line":1250,"range":{"start_line":1250,"start_character":40,"end_line":1250,"end_character":47},"updated":"2017-01-24 17:02:01.000000000","message":"nit: in \u003cmethod\u003e and \u003cseconds\u003e it actually spells out temporary URL, I think for user facing doc this looks better, plus it helps with localization efforts (although i\u0027m not sure this help text is ever localized)","commit_id":"dfe4b3c0d5ca89797475b683edae2e8b09851a65"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"757b656311a1a250d938468759d8411aba9a5d6f","unresolved":false,"context_lines":[{"line_number":1268,"context_line":"    parser.add_argument("},{"line_number":1269,"context_line":"        \u0027--iso8601\u0027, action\u003d\u0027store_true\u0027,"},{"line_number":1270,"context_line":"        default\u003dFalse,"},{"line_number":1271,"context_line":"        help\u003d(\"If present, the tempURL will contain an ISO 8601 UTC timestamp \""},{"line_number":1272,"context_line":"              \"instead of a Unix timestamp.\"),"},{"line_number":1273,"context_line":"    )"},{"line_number":1274,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_5f1f44b6","line":1271,"range":{"start_line":1271,"start_character":31,"end_line":1271,"end_character":38},"updated":"2017-01-24 17:02:01.000000000","message":"same here","commit_id":"dfe4b3c0d5ca89797475b683edae2e8b09851a65"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":1245,"context_line":"                            2017-01-25T05:03:20"},{"line_number":1246,"context_line":"                            2017-01-25"},{"line_number":1247,"context_line":"                            2017-01-25T05:03:20Z"},{"line_number":1248,"context_line":"                            2017-01-25Z"},{"line_number":1249,"context_line":"  \u003cpath\u003e                The full path or storage URL to the Swift object."},{"line_number":1250,"context_line":"                        Example: /v1/AUTH_account/c/o"},{"line_number":1251,"context_line":"                        or: http://saio:8080/v1/AUTH_account/c/o"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_7e922f59","line":1248,"range":{"start_line":1248,"start_character":28,"end_line":1248,"end_character":39},"updated":"2017-01-25 20:14:38.000000000","message":"same here, explain the default time when only date is provided","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"59a7aaf9018ccc829b70e1773c029d693e5e905d","unresolved":false,"context_lines":[{"line_number":1257,"context_line":""},{"line_number":1258,"context_line":"                             (eg 1997-07-16T19:20:30Z)"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":"                        Please be aware that if you use one of the first two"},{"line_number":1261,"context_line":"                        formats, the timestamp is generated using your local"},{"line_number":1262,"context_line":"                        timezone. If only a date is pecified, the time part"},{"line_number":1263,"context_line":"                        used will equal to 00:00:00."},{"line_number":1264,"context_line":"  \u003cpath\u003e                The full path or storage URL to the Swift object."},{"line_number":1265,"context_line":"                        Example: /v1/AUTH_account/c/o"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_dda4070a","line":1262,"range":{"start_line":1260,"start_character":24,"end_line":1262,"end_character":33},"updated":"2017-02-28 17:58:18.000000000","message":"I\u0027d rephrase this as in last file.","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"}],"swiftclient/utils.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        return \u0027%.1f%s\u0027 % (num, suffix)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def generate_temp_url(path, timestamp, key, method, absolute\u003dFalse,"},{"line_number":70,"context_line":"                      prefix\u003dFalse, iso8601\u003dFalse):"},{"line_number":71,"context_line":"    \"\"\"Generates a temporary URL that gives unauthenticated access to the"},{"line_number":72,"context_line":"    Swift object."}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_7e230f06","line":69,"range":{"start_line":69,"start_character":28,"end_line":69,"end_character":37},"updated":"2017-01-25 20:14:38.000000000","message":"I think this might be considered breaking the API?\nThoughts?","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8b1465507d5f4585743b1572533ce8cd9f4de95a","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        return \u0027%.1f%s\u0027 % (num, suffix)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def generate_temp_url(path, timestamp, key, method, absolute\u003dFalse,"},{"line_number":70,"context_line":"                      prefix\u003dFalse, iso8601\u003dFalse):"},{"line_number":71,"context_line":"    \"\"\"Generates a temporary URL that gives unauthenticated access to the"},{"line_number":72,"context_line":"    Swift object."}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_c84e02c1","line":69,"range":{"start_line":69,"start_character":28,"end_line":69,"end_character":37},"in_reply_to":"3a461143_7e230f06","updated":"2017-01-25 21:25:01.000000000","message":"Bleh. I know we\u0027ve hit issues with this sort of thing before in https://review.openstack.org/#/c/189815/ :-/\n\nMight be safer to leave it as \"seconds\" and make sure the docstring is clear that it may be an ISO8601 timestamp.","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            timestamp \u003d float(timestamp)"},{"line_number":99,"context_line":"        except ValueError:"},{"line_number":100,"context_line":"            formats \u003d ("},{"line_number":101,"context_line":"                EXPIRES_ISO8601_FORMAT,"},{"line_number":102,"context_line":"                EXPIRES_ISO8601_FORMAT[:-1],"},{"line_number":103,"context_line":"                SHORT_EXPIRES_ISO8601_FORMAT,"},{"line_number":104,"context_line":"                SHORT_EXPIRES_ISO8601_FORMAT[:-1])"},{"line_number":105,"context_line":"            for f in formats:"},{"line_number":106,"context_line":"                try:"},{"line_number":107,"context_line":"                    t \u003d time.strptime(timestamp, f)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_58cae350","line":104,"range":{"start_line":101,"start_character":16,"end_line":104,"end_character":50},"updated":"2017-01-25 20:14:38.000000000","message":"the challenge i\u0027m finding here is that in the help we state we support \u0027ISO 8601 timestamp\u0027, but it\u0027s really just a subset of all supported iso 8601 formats.\n\nFor example, these formats would not be supported, but they are valid iso 8601 timestamps:\n  20170126T065000Z\n  20170126\n\nThe last example is even more concerning, because it is a valid iso8601 format, but this method would also parse it as a time in seconds since epoch.\n\nshould we try to support all iso8601 formats? maybe add a dependency to something like: https://pypi.python.org/pypi/iso8601\nor maybe we get more opinionated and call out the very specific formats we support? I\u0027d support this too, just needs to make sure it is well documented.","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                    elif f \u003d\u003d SHORT_EXPIRES_ISO8601_FORMAT[:-1]:"},{"line_number":116,"context_line":"                        timestamp \u003d int(time.mktime(t))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"                    absolute \u003d True"},{"line_number":119,"context_line":"                    break"},{"line_number":120,"context_line":"                except ValueError:"},{"line_number":121,"context_line":"                    t \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_c1b6e63c","line":118,"range":{"start_line":118,"start_character":20,"end_line":118,"end_character":35},"updated":"2017-01-25 20:14:38.000000000","message":"nice","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":17245,"name":"Christopher Bartz","email":"bartz@dkrz.de","username":"cbartz"},"change_message_id":"a460de020b360c344e014ccca4cdee4667fa3b72","unresolved":false,"context_lines":[{"line_number":27,"context_line":"TRUE_VALUES \u003d set((\u0027true\u0027, \u00271\u0027, \u0027yes\u0027, \u0027on\u0027, \u0027t\u0027, \u0027y\u0027))"},{"line_number":28,"context_line":"EMPTY_ETAG \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":29,"context_line":"EXPIRES_ISO8601_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%SZ\u0027"},{"line_number":30,"context_line":"SHORT_EXPIRES_ISO8601_FORMAT \u003d \u0027%Y-%m-%d\u0027"},{"line_number":31,"context_line":"TIME_ERRMSG \u003d (\u0027time must either be a whole number or in specific \u0027"},{"line_number":32,"context_line":"               \u0027ISO 8601 format.\u0027)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_68c3c389","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":41},"updated":"2017-02-07 18:36:30.000000000","message":"I removed this format with the UTC designator, because it is not compliant to ISO 8601 (TZD only apply to date+time strings). wdyt? Should we stick to strict ISO 8601 or make an exception here?","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"59a7aaf9018ccc829b70e1773c029d693e5e905d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"TRUE_VALUES \u003d set((\u0027true\u0027, \u00271\u0027, \u0027yes\u0027, \u0027on\u0027, \u0027t\u0027, \u0027y\u0027))"},{"line_number":28,"context_line":"EMPTY_ETAG \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":29,"context_line":"EXPIRES_ISO8601_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%SZ\u0027"},{"line_number":30,"context_line":"SHORT_EXPIRES_ISO8601_FORMAT \u003d \u0027%Y-%m-%d\u0027"},{"line_number":31,"context_line":"TIME_ERRMSG \u003d (\u0027time must either be a whole number or in specific \u0027"},{"line_number":32,"context_line":"               \u0027ISO 8601 format.\u0027)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_fde1cbff","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":41},"in_reply_to":"1a430d35_68c3c389","updated":"2017-02-28 17:58:18.000000000","message":"works for me :)\nas timburke mentioned on a IRC, we can add support later if it\u0027s something that comes up....","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"59a7aaf9018ccc829b70e1773c029d693e5e905d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    :param absolute: if True then the seconds parameter is interpreted as a"},{"line_number":91,"context_line":"        Unix timestamp, if seconds represents an integer."},{"line_number":92,"context_line":"    :param prefix: if True then a prefix-based temporary URL will be generated."},{"line_number":93,"context_line":"    :param iso8601: if True, an URL containing an ISO 8601 UTC timestamp"},{"line_number":94,"context_line":"        instead of a UNIX timestamp will be created."},{"line_number":95,"context_line":"    :raises: ValueError if timestamp or path is not in valid format."},{"line_number":96,"context_line":"    :return: the path portion of a temporary URL"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_633e19ba","line":93,"range":{"start_line":93,"start_character":29,"end_line":93,"end_character":35},"updated":"2017-02-28 17:58:18.000000000","message":"a URL","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":17245,"name":"Christopher Bartz","email":"bartz@dkrz.de","username":"cbartz"},"change_message_id":"c2e5a8b3059c51424db8fd8b1dde48a78a6f6bb5","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    :param absolute: if True then the seconds parameter is interpreted as a"},{"line_number":91,"context_line":"        Unix timestamp, if seconds represents an integer."},{"line_number":92,"context_line":"    :param prefix: if True then a prefix-based temporary URL will be generated."},{"line_number":93,"context_line":"    :param iso8601: if True, an URL containing an ISO 8601 UTC timestamp"},{"line_number":94,"context_line":"        instead of a UNIX timestamp will be created."},{"line_number":95,"context_line":"    :raises: ValueError if timestamp or path is not in valid format."},{"line_number":96,"context_line":"    :return: the path portion of a temporary URL"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_ae48dc2e","line":93,"range":{"start_line":93,"start_character":29,"end_line":93,"end_character":35},"in_reply_to":"ba2be162_633e19ba","updated":"2017-03-01 10:21:07.000000000","message":"Hehe, thats because I am German. I pronounce it alwas \u0027UH\u0027RL, so I want to use \u0027an\u0027 because its a vocal sound for me.","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"59a7aaf9018ccc829b70e1773c029d693e5e905d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            for f in formats:"},{"line_number":107,"context_line":"                try:"},{"line_number":108,"context_line":"                    t \u003d time.strptime(seconds, f)"},{"line_number":109,"context_line":"                    if f \u003d\u003d EXPIRES_ISO8601_FORMAT:"},{"line_number":110,"context_line":"                        timestamp \u003d timegm(t)"},{"line_number":111,"context_line":"                    elif f \u003d\u003d EXPIRES_ISO8601_FORMAT[:-1]:"},{"line_number":112,"context_line":"                        # Use local time if UTC designator is missing."},{"line_number":113,"context_line":"                        timestamp \u003d int(time.mktime(t))"},{"line_number":114,"context_line":"                    elif f \u003d\u003d SHORT_EXPIRES_ISO8601_FORMAT:"},{"line_number":115,"context_line":"                        timestamp \u003d int(time.mktime(t))"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"                    absolute \u003d True"},{"line_number":118,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_1e5f7273","line":115,"range":{"start_line":109,"start_character":20,"end_line":115,"end_character":55},"updated":"2017-02-28 17:58:18.000000000","message":"maybe just if/else ?","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":17245,"name":"Christopher Bartz","email":"bartz@dkrz.de","username":"cbartz"},"change_message_id":"c2e5a8b3059c51424db8fd8b1dde48a78a6f6bb5","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            for f in formats:"},{"line_number":107,"context_line":"                try:"},{"line_number":108,"context_line":"                    t \u003d time.strptime(seconds, f)"},{"line_number":109,"context_line":"                    if f \u003d\u003d EXPIRES_ISO8601_FORMAT:"},{"line_number":110,"context_line":"                        timestamp \u003d timegm(t)"},{"line_number":111,"context_line":"                    elif f \u003d\u003d EXPIRES_ISO8601_FORMAT[:-1]:"},{"line_number":112,"context_line":"                        # Use local time if UTC designator is missing."},{"line_number":113,"context_line":"                        timestamp \u003d int(time.mktime(t))"},{"line_number":114,"context_line":"                    elif f \u003d\u003d SHORT_EXPIRES_ISO8601_FORMAT:"},{"line_number":115,"context_line":"                        timestamp \u003d int(time.mktime(t))"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"                    absolute \u003d True"},{"line_number":118,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_01a1b9a9","line":115,"range":{"start_line":109,"start_character":20,"end_line":115,"end_character":55},"in_reply_to":"ba2be162_1e5f7273","updated":"2017-03-01 10:21:07.000000000","message":"Sometimes I feel explicit is better, because its directly visible and not so error prone when extending the code (its possible to forget a case, if we extend it with new formats). On the other side, in this case its really clear and I think when we extend it with more formats further code review will ensure that no case is forgotten. So an else should be fine too.","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"59a7aaf9018ccc829b70e1773c029d693e5e905d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            if t is None:"},{"line_number":123,"context_line":"                raise ValueError()"},{"line_number":124,"context_line":"        else:"},{"line_number":125,"context_line":"            if not timestamp.is_integer():"},{"line_number":126,"context_line":"                raise ValueError()"},{"line_number":127,"context_line":"            timestamp \u003d int(timestamp)"},{"line_number":128,"context_line":"            if timestamp \u003c 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_5ee48a0c","line":125,"updated":"2017-02-28 17:58:18.000000000","message":"this is probably a stupid python question I should know the answer to, but why do we first cast to float and then to integer?\n\nI noticed it was already done this way prior, so I\u0027m just wondering why this was done this way....","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":17245,"name":"Christopher Bartz","email":"bartz@dkrz.de","username":"cbartz"},"change_message_id":"c2e5a8b3059c51424db8fd8b1dde48a78a6f6bb5","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            if t is None:"},{"line_number":123,"context_line":"                raise ValueError()"},{"line_number":124,"context_line":"        else:"},{"line_number":125,"context_line":"            if not timestamp.is_integer():"},{"line_number":126,"context_line":"                raise ValueError()"},{"line_number":127,"context_line":"            timestamp \u003d int(timestamp)"},{"line_number":128,"context_line":"            if timestamp \u003c 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_214f9d93","line":125,"in_reply_to":"ba2be162_5ee48a0c","updated":"2017-03-01 10:21:07.000000000","message":"I think the reason is to not raise an error when a  Unix timestamp in float format is passed, e.g. time.time() returns a float (https://docs.python.org/2/library/time.html). In this way, the program is a little bit more failure tolerant.","commit_id":"fb4b263ea98f18fc9b7500d20a22bbfb7cc5c917"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"50e05940d3aabbd799a4762ddfc83cbd05f6bdd4","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                EXPIRES_ISO8601_FORMAT[:-1],"},{"line_number":105,"context_line":"                SHORT_EXPIRES_ISO8601_FORMAT)"},{"line_number":106,"context_line":"            for f in formats:"},{"line_number":107,"context_line":"                try:"},{"line_number":108,"context_line":"                    t \u003d time.strptime(seconds, f)"},{"line_number":109,"context_line":"                    if f \u003d\u003d EXPIRES_ISO8601_FORMAT:"},{"line_number":110,"context_line":"                        timestamp \u003d timegm(t)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba2be162_b6681889","line":107,"updated":"2017-03-01 17:40:32.000000000","message":"how about reducing the try block to just line 108, like this: http://paste.openstack.org/show/600982/","commit_id":"0ed575c76d8a3dc1267a9a1590d1d726169e0080"}],"tests/unit/test_shell.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"    @mock.patch(\u0027swiftclient.shell.generate_temp_url\u0027, return_value\u003d\u0027\u0027)"},{"line_number":1565,"context_line":"    def test_temp_url_iso8601(self, temp_url):"},{"line_number":1566,"context_line":"        argv \u003d [\"\", \"tempurl\", \"GET\", \"60\", \"/v1/AUTH_account/c/\","},{"line_number":1567,"context_line":"                \"secret_key\", \"--iso8601\"]"},{"line_number":1568,"context_line":"        swiftclient.shell.main(argv)"},{"line_number":1569,"context_line":"        temp_url.assert_called_with("}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_c1d8a620","line":1566,"range":{"start_line":1566,"start_character":38,"end_line":1566,"end_character":42},"updated":"2017-01-25 20:14:38.000000000","message":"it probably makes sense to also test with iso8601 dates+times, wdyt?","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":1613,"context_line":"        expected \u003d (\"/v1/a/c/?temp_url_sig\u003d%s\u0026temp_url_expires\u003d%s\""},{"line_number":1614,"context_line":"                    \"\u0026temp_url_prefix\u003d\\n\" % (sig, expires))"},{"line_number":1615,"context_line":"        self.assertEqual(expected, output.out)"},{"line_number":1616,"context_line":""},{"line_number":1617,"context_line":"    def test_temp_url_error_output(self):"},{"line_number":1618,"context_line":"        expected \u003d \u0027path must be full path to an object e.g. /v1/a/c/o\\n\u0027"},{"line_number":1619,"context_line":"        for bad_path in (\u0027/v1/a/c\u0027, \u0027v1/a/c/o\u0027, \u0027/v1/a/c/\u0027, \u0027/v1/a//o\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_81d85ef1","line":1616,"updated":"2017-01-25 20:14:38.000000000","message":"same here, let\u0027s add some tests with iso8601 dates. especially different formats and what the output looks like for each of them.","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"}],"tests/unit/test_utils.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                                  self.key, self.method)"},{"line_number":159,"context_line":"        self.assertEqual(url, self.expected_url)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        # Don\u0027t care about absolute arg."},{"line_number":162,"context_line":"        url \u003d u.generate_temp_url(self.url, \u00272014-05-13T17:53:20Z\u0027,"},{"line_number":163,"context_line":"                                  self.key, self.method, absolute\u003dTrue)"},{"line_number":164,"context_line":"        self.assertEqual(url, self.expected_url)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_843eacb6","line":161,"range":{"start_line":161,"start_character":10,"end_line":161,"end_character":39},"updated":"2017-01-25 20:14:38.000000000","message":"nice","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"103e53e93a165c3d31651ab7151a886d79e42cd6","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                         \u0027time must either be a whole number or in \u0027"},{"line_number":302,"context_line":"                         \u0027ISO 8601 format.\u0027)"},{"line_number":303,"context_line":"        with self.assertRaises(ValueError) as exc_manager:"},{"line_number":304,"context_line":"            u.generate_temp_url(self.url, \u00272015-05\u0027, self.key, self.method)"},{"line_number":305,"context_line":"        self.assertEqual(exc_manager.exception.args[0],"},{"line_number":306,"context_line":"                         \u0027time must either be a whole number or in \u0027"},{"line_number":307,"context_line":"                         \u0027ISO 8601 format.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_ad7e2bac","line":304,"range":{"start_line":304,"start_character":43,"end_line":304,"end_character":50},"updated":"2017-01-25 20:14:38.000000000","message":"how about something like: 2015-05-01T01:00 (no seconds)","commit_id":"ab8250a9104a63545330fbe78e789599b0ea692b"}]}
