)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Previously, a Timestamp could be constructed with a floating point"},{"line_number":10,"context_line":"offset, but Timestamp.internal would subsequently raise a"},{"line_number":11,"context_line":"TypeError. This patch modifies Timestamp to check that offset is an"},{"line_number":12,"context_line":"integer value during construction and otherwise raise a ValueError."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Note: non-int types with integer values (e.g. boolean) were previously"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"0ad84939_9bf7aafb","line":11,"updated":"2026-05-11 21:05:52.000000000","message":"master:\n\n```\n\u003e\u003e\u003e Timestamp(0, offset\u003d1.0).offset\n1.0\n\u003e\u003e\u003e Timestamp(0, offset\u003d1.0).internal\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/vagrant/swift/swift/common/utils/timestamp.py\", line 455, in internal\n    return INTERNAL_FORMAT % (self.timestamp, self.offset)\nTypeError: %x format: an integer is required, not float\n```\n\nthis change:\n\n```\n\u003e\u003e\u003e Timestamp(0, offset\u003d1.0).offset\n1\n\u003e\u003e\u003e Timestamp(0, offset\u003d1.0).internal\n\u00270000000000.00000_0000000000000001\u0027\n```\n\nI think this is an improvement.  However, since previously the constructor \"allowed\" using `offset\u003dfloat` (buy doing so would almost definitely blow up); I think you could argue it\u0027ll be slightly harder to make it an error to construct a `Timestamp` with a non-integer offset in the future.","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Previously, a Timestamp could be constructed with a floating point"},{"line_number":10,"context_line":"offset, but Timestamp.internal would subsequently raise a"},{"line_number":11,"context_line":"TypeError. This patch modifies Timestamp to check that offset is an"},{"line_number":12,"context_line":"integer value during construction and otherwise raise a ValueError."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Note: non-int types with integer values (e.g. boolean) were previously"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"af262608_55d9dd5b","line":11,"in_reply_to":"0ad84939_9bf7aafb","updated":"2026-05-12 10:15:21.000000000","message":"Fixed","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":true,"context_lines":[{"line_number":12,"context_line":"integer value during construction and otherwise raise a ValueError."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Note: non-int types with integer values (e.g. boolean) were previously"},{"line_number":15,"context_line":"allowed and are therefore still supported."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Drive-By: always return the current offset from"},{"line_number":18,"context_line":"Timestamp.increment_offset() and add test coverage for that method."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"f353f9b5_ed5d9960","line":15,"updated":"2026-05-11 21:05:52.000000000","message":"well that\u0027s dumb, master:\n\n```\n\u003e\u003e\u003e Timestamp(0, offset\u003dTrue).offset\n1\n\u003e\u003e\u003e Timestamp(0, offset\u003dTrue).internal\n\u00270000000000.00000_0000000000000001\u0027\n```\n\n^ I feel like we could take an opinion here","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9d2a931210e0862b0b2232f2db6d01ee53698aab","unresolved":false,"context_lines":[{"line_number":12,"context_line":"integer value during construction and otherwise raise a ValueError."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Note: non-int types with integer values (e.g. boolean) were previously"},{"line_number":15,"context_line":"allowed and are therefore still supported."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Drive-By: always return the current offset from"},{"line_number":18,"context_line":"Timestamp.increment_offset() and add test coverage for that method."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"445d13f5_939b8293","line":15,"in_reply_to":"23bfe536_3d066228","updated":"2026-05-12 12:29:52.000000000","message":"Acknowledged","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":true,"context_lines":[{"line_number":12,"context_line":"integer value during construction and otherwise raise a ValueError."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Note: non-int types with integer values (e.g. boolean) were previously"},{"line_number":15,"context_line":"allowed and are therefore still supported."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Drive-By: always return the current offset from"},{"line_number":18,"context_line":"Timestamp.increment_offset() and add test coverage for that method."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"23bfe536_3d066228","line":15,"in_reply_to":"f353f9b5_ed5d9960","updated":"2026-05-12 10:15:21.000000000","message":"I don\u0027t feel like I need to change this, and as explained in an earlier comment I have been burnt before for making interfaces less tolerant than they were.","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9d2a931210e0862b0b2232f2db6d01ee53698aab","unresolved":true,"context_lines":[{"line_number":12,"context_line":"int value *during construction* and otherwise raise a TypeError."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Note: a boolean value was previously allowed and is therefore still"},{"line_number":15,"context_line":"supported."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Drive-By: always return the current offset from"},{"line_number":18,"context_line":"Timestamp.increment_offset() and add test coverage for that method."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"794142e1_38b02d34","line":15,"updated":"2026-05-12 12:29:52.000000000","message":"`None` or other falsy values no-op too\n\n```\n\u003e\u003e\u003e Timestamp(0, offset\u003dNone).internal\n\u00270000000000.00000\u0027\n```","commit_id":"33967853276f0987a58e5b3aca450173adadc064"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9d2a931210e0862b0b2232f2db6d01ee53698aab","unresolved":true,"context_lines":[{"line_number":15,"context_line":"supported."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Drive-By: always return the current offset from"},{"line_number":18,"context_line":"Timestamp.increment_offset() and add test coverage for that method."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ie2d33b96687bc319b86f375e339d9a99f3892ed5"},{"line_number":21,"context_line":"Signed-off-by: Alistair Coles \u003calistairncoles@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ab0b6058_e425ed0d","line":18,"updated":"2026-05-12 12:29:52.000000000","message":"AFAICT this is the only drive-by on the change now","commit_id":"33967853276f0987a58e5b3aca450173adadc064"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"545711f4d71d5cdeb18851d979057f0f9d0ac6ae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0c4b7efb_e3768659","updated":"2026-05-06 14:06:05.000000000","message":"Andressa, Tim, thanks for the reviews. I have made some changes in response.","commit_id":"21a5cb4d12190cd2607f0ba1c8e07bc675fe421e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"765f2e80aa69115bc4ca7df930a389ad5800aec7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"231f6f9f_f2113e2d","updated":"2026-04-28 22:21:40.000000000","message":"I\u0027d be content to see this merged, but the more I poke at it, the more confused I get. Is there a reason for wanting to support floats? I\u0027m starting to come around toward some much more strict type checking, like `isinstance(value, int) and not isinstance(value, bool)`","commit_id":"21a5cb4d12190cd2607f0ba1c8e07bc675fe421e"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"90631d93fcdc368a2747c5ce873d1fd2d141018c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"aafc15ff_081c653f","updated":"2026-04-27 14:04:23.000000000","message":"Thanks for adding this check to make our code more reliable. I also liked that you added an unit test for the change. As I added in my comment, I\u0027m good with the current state of things.","commit_id":"21a5cb4d12190cd2607f0ba1c8e07bc675fe421e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"bf630282_11a2a3f3","updated":"2026-05-11 21:05:52.000000000","message":"Just as I was starting to grok the \"it\u0027s the value not type\" idea, I found this gem:\n\n```\nts.offset \u003d timestamp.Timestamp(3)`\n```\n\n^ this looks far too close to something I might type on accident.  On master it\u0027s clearly a bug:\n\n```\n\u003e\u003e\u003e ts \u003d Timestamp.now()\n\u003e\u003e\u003e ts.offset \u003d Timestamp(3)\n\u003e\u003e\u003e ts.internal\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/vagrant/swift/swift/common/utils/timestamp.py\", line 455, in internal\n    return INTERNAL_FORMAT % (self.timestamp, self.offset)\nTypeError: %x format: an integer is required, not Timestamp\n```\n\non this change:\n\n```\n\u003e\u003e\u003e ts \u003d Timestamp.now()\n\u003e\u003e\u003e ts.offset \u003d Timestamp(3)\n\u003e\u003e\u003e ts.internal\n\u00271778533005.73723_0000000000000003\u0027\n```\n\n^ and I\u0027m just not sure that\u0027s what we want?\n\nI\u0027m *guessing* I meant:\n\n```\nts \u003d req.timestamp\n...\n# use this other timestamp\u0027s offset\nts \u003d other.timestamp\n```\n\n... OR\n\n```\nts \u003d req.timestamp\n...\n# use this other timestamp\u0027s offset\nts.offset \u003d other.timestamp.offset\n```\n\nBut I don\u0027t think I could ever mean:\n\n```\n# use this other timestamp\u0027s offset\nts.offset \u003d other.timestamp\n```\n\n... and the fact that it might just *work* b/c `make_timestamp_iter` likes non-float timestamps is *scary*:\n\n```\n\u003e\u003e\u003e t \u003d Timestamp.now()\n\u003e\u003e\u003e t.offset \u003d next(ts)\n\u003e\u003e\u003e t.internal\n\u00271778533320.11681_000000006a0243b9\u0027\n```\n\nI\u0027d prefer master:\n\n```\n\u003e\u003e\u003e from test.unit import make_timestamp_iter\n\u003e\u003e\u003e from swift.common.utils import Timestamp\n\u003e\u003e\u003e ts \u003d make_timestamp_iter()\n\u003e\u003e\u003e t \u003d Timestamp.now()\n\u003e\u003e\u003e t.offset \u003d next(ts)\n\u003e\u003e\u003e t.internal\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/vagrant/swift/swift/common/utils/timestamp.py\", line 455, in internal\n    return INTERNAL_FORMAT % (self.timestamp, self.offset)\nTypeError: %x format: an integer is required, not Timestamp\n```\n\nMaybe we can just be more strict up-front?\n\n988177: sq: does anyone need this non-int behavior? | https://review.opendev.org/c/openstack/swift/+/988177\n\n\u003e Special cases aren\u0027t special enough to break the rules.\n\u003e Errors should never pass silently.\n\u003e In the face of ambiguity, refuse the temptation to guess.","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5cc6ab5d_c0d4a019","updated":"2026-05-12 10:15:21.000000000","message":"Somewhere along the way with this patch I lost sight of the bug I was trying to fix: on master float was accepted by the constructor, but *any* float value would cause a TypeError when `.internal` was called, *including integer-valued floats*. But I wrongly got it in my head that I needed to continue to support integer-valued floats.\n\nSo the float *type* can be entirely disallowed without loss of backwards \u0027compatibility\u0027. And supporting other cast-able types like Timestamp was just a distraction I fell into.","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"5aa7e00a4b6f730c88dde7eb775d6c3af5f39309","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4633391e_39a6f3b1","updated":"2026-05-07 11:05:00.000000000","message":"Thank you for kindly addressing my comment, this lgtm!","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9d2a931210e0862b0b2232f2db6d01ee53698aab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"6b6fce6e_99d3d49a","updated":"2026-05-12 12:29:52.000000000","message":"this is more faithful to existing behavior; makes sense to me.","commit_id":"33967853276f0987a58e5b3aca450173adadc064"}],"swift/common/utils/timestamp.py":[{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"90631d93fcdc368a2747c5ce873d1fd2d141018c","unresolved":true,"context_lines":[{"line_number":103,"context_line":"            float_timestamp \u003d float(timestamp)"},{"line_number":104,"context_line":"            self.offset \u003d getattr(timestamp, \u0027offset\u0027, 0)"},{"line_number":105,"context_line":"        # increment offset"},{"line_number":106,"context_line":"        if int(offset) !\u003d offset:"},{"line_number":107,"context_line":"            raise ValueError(\u0027offset must be an integer value\u0027)"},{"line_number":108,"context_line":"        if offset \u003e\u003d 0:"},{"line_number":109,"context_line":"            self.offset +\u003d int(offset)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b05b5a70_b223917c","line":106,"updated":"2026-04-27 14:04:23.000000000","message":"I\u0027m not sure if it\u0027s of our interest or not but I\u0027ll add this comment here in case we want to add an additional validation. Since bool is a subclass of integer the validation `int(offset) !\u003d offset` doesn\u0027t catch boolean values so Timestamp(...., offset\u003dTrue) won\u0027t be catch because Python will evaluate True to 1. Just to be totally clear, I\u0027m ok with the state of things, if you believe it\u0027s not necessary it\u0027s fine by me.","commit_id":"3c809dc60dff122eb99d51b9e3d37ff770d33810"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            float_timestamp \u003d float(timestamp)"},{"line_number":104,"context_line":"            self.offset \u003d getattr(timestamp, \u0027offset\u0027, 0)"},{"line_number":105,"context_line":"        # increment offset"},{"line_number":106,"context_line":"        if int(offset) !\u003d offset:"},{"line_number":107,"context_line":"            raise ValueError(\u0027offset must be an integer value\u0027)"},{"line_number":108,"context_line":"        if offset \u003e\u003d 0:"},{"line_number":109,"context_line":"            self.offset +\u003d int(offset)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bad0f2d7_db807036","line":106,"in_reply_to":"93d20153_d18aa220","updated":"2026-05-12 10:15:21.000000000","message":"Done","commit_id":"3c809dc60dff122eb99d51b9e3d37ff770d33810"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"765f2e80aa69115bc4ca7df930a389ad5800aec7","unresolved":true,"context_lines":[{"line_number":103,"context_line":"            float_timestamp \u003d float(timestamp)"},{"line_number":104,"context_line":"            self.offset \u003d getattr(timestamp, \u0027offset\u0027, 0)"},{"line_number":105,"context_line":"        # increment offset"},{"line_number":106,"context_line":"        if int(offset) !\u003d offset:"},{"line_number":107,"context_line":"            raise ValueError(\u0027offset must be an integer value\u0027)"},{"line_number":108,"context_line":"        if offset \u003e\u003d 0:"},{"line_number":109,"context_line":"            self.offset +\u003d int(offset)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ea897cfa_35565455","line":106,"in_reply_to":"b05b5a70_b223917c","updated":"2026-04-28 22:21:40.000000000","message":"A good reminder! Every now and then I get caught out by that, though I suppose it\u0027s nice that we can do things like\n```\n\u003e\u003e\u003e sum(\u0027a\u0027 in x for x in (\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027))\n2\n```\n(Though I tend to prefer something more explicit like\n```\n\u003e\u003e\u003e sum(1 if \u0027a\u0027 in x else 0 for x in (\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027))\n2\n```\nmyself.)\n\nI think the goal is more just to ensure we don\u0027t allow floats, though, since\n1. they previously caused things to blow up in unexpected ways and\n2. if we allowed them naively, we could lose the precision that callers supplied.","commit_id":"3c809dc60dff122eb99d51b9e3d37ff770d33810"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"545711f4d71d5cdeb18851d979057f0f9d0ac6ae","unresolved":true,"context_lines":[{"line_number":103,"context_line":"            float_timestamp \u003d float(timestamp)"},{"line_number":104,"context_line":"            self.offset \u003d getattr(timestamp, \u0027offset\u0027, 0)"},{"line_number":105,"context_line":"        # increment offset"},{"line_number":106,"context_line":"        if int(offset) !\u003d offset:"},{"line_number":107,"context_line":"            raise ValueError(\u0027offset must be an integer value\u0027)"},{"line_number":108,"context_line":"        if offset \u003e\u003d 0:"},{"line_number":109,"context_line":"            self.offset +\u003d int(offset)"}],"source_content_type":"text/x-python","patch_set":1,"id":"93d20153_d18aa220","line":106,"in_reply_to":"ea897cfa_35565455","updated":"2026-05-06 14:06:05.000000000","message":"A long time ago I \"helpfully\" tightened up a method that wasn\u0027t broken but was documented to accept integers. I added checks so that it really did only accept integers, rather than just casting to ``int``. Turned out that someone had been happily passing floats in and the change broke them, and they weren\u0027t happy. Since then I have been wary about unnecessarily making interfaces more brittle. So , since you could write ``Timestamp(123, offset\u003dTrue)`` before, I am inclined to leave it that way, however weird it looks.\n\nBut, kudos for the thorough review 👏","commit_id":"3c809dc60dff122eb99d51b9e3d37ff770d33810"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"765f2e80aa69115bc4ca7df930a389ad5800aec7","unresolved":true,"context_lines":[{"line_number":431,"context_line":"            return"},{"line_number":432,"context_line":"        if value \u003c 0:"},{"line_number":433,"context_line":"            raise ValueError(\u0027offset must be non-negative\u0027)"},{"line_number":434,"context_line":"        self.offset +\u003d value"},{"line_number":435,"context_line":"        return self.offset"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"4a260780_1bb9e268","line":434,"updated":"2026-04-28 22:21:40.000000000","message":"Now *this part* starts to feel a little sneaky/subtle -- we should maybe include a comment here about why we *don\u0027t* want/need an `int(...)` here. (Or maybe we do? IDK any more...)","commit_id":"21a5cb4d12190cd2607f0ba1c8e07bc675fe421e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":431,"context_line":"            return"},{"line_number":432,"context_line":"        if value \u003c 0:"},{"line_number":433,"context_line":"            raise ValueError(\u0027offset must be non-negative\u0027)"},{"line_number":434,"context_line":"        self.offset +\u003d value"},{"line_number":435,"context_line":"        return self.offset"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"f7140f56_4b7a5b33","line":434,"in_reply_to":"00058119_8ba5f82d","updated":"2026-05-12 10:15:21.000000000","message":"Done","commit_id":"21a5cb4d12190cd2607f0ba1c8e07bc675fe421e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"545711f4d71d5cdeb18851d979057f0f9d0ac6ae","unresolved":true,"context_lines":[{"line_number":431,"context_line":"            return"},{"line_number":432,"context_line":"        if value \u003c 0:"},{"line_number":433,"context_line":"            raise ValueError(\u0027offset must be non-negative\u0027)"},{"line_number":434,"context_line":"        self.offset +\u003d value"},{"line_number":435,"context_line":"        return self.offset"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"00058119_8ba5f82d","line":434,"in_reply_to":"4a260780_1bb9e268","updated":"2026-05-06 14:06:05.000000000","message":"I missed the potential TypeError that arises from not casting to int here, so I think that and the other validation does need to happen before the ``+\u003d``","commit_id":"21a5cb4d12190cd2607f0ba1c8e07bc675fe421e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":true,"context_lines":[{"line_number":426,"context_line":"            would exceed the maximum supported offset."},{"line_number":427,"context_line":"        \"\"\""},{"line_number":428,"context_line":"        if not value:"},{"line_number":429,"context_line":"            return"},{"line_number":430,"context_line":"        if value \u003c 0:"},{"line_number":431,"context_line":"            raise ValueError(\u0027offset must be non-negative\u0027)"},{"line_number":432,"context_line":"        self.offset +\u003d value"}],"source_content_type":"text/x-python","patch_set":4,"id":"e50ed0b3_d2337ed9","side":"PARENT","line":429,"updated":"2026-05-11 21:05:52.000000000","message":"so it\u0027s kind of weird on master how we return `None` in this case...\n\n```\n\u003e\u003e\u003e from swift.common.utils import Timestamp\n\u003e\u003e\u003e t \u003d Timestamp.now()\n\u003e\u003e\u003e t.offset\n0\n\u003e\u003e\u003e t.increment_offset(1)\n1\n\u003e\u003e\u003e t.increment_offset(0)\n\u003e\u003e\u003e t.increment_offset(None)\n\u003e\u003e\u003e t.increment_offset(\u0027\u0027)\n\u003e\u003e\u003e t.offset\n1\n```","commit_id":"18e2528e5077e173b1f950674a27857a0e519706"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":426,"context_line":"            would exceed the maximum supported offset."},{"line_number":427,"context_line":"        \"\"\""},{"line_number":428,"context_line":"        if not value:"},{"line_number":429,"context_line":"            return"},{"line_number":430,"context_line":"        if value \u003c 0:"},{"line_number":431,"context_line":"            raise ValueError(\u0027offset must be non-negative\u0027)"},{"line_number":432,"context_line":"        self.offset +\u003d value"}],"source_content_type":"text/x-python","patch_set":4,"id":"650b4c22_2ce18630","side":"PARENT","line":429,"in_reply_to":"e50ed0b3_d2337ed9","updated":"2026-05-12 10:15:21.000000000","message":"Acknowledged","commit_id":"18e2528e5077e173b1f950674a27857a0e519706"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":true,"context_lines":[{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    def _validate_offset(self, value):"},{"line_number":406,"context_line":"        if int(value) !\u003d value:"},{"line_number":407,"context_line":"            raise ValueError(\u0027offset must be an integer value\u0027)"},{"line_number":408,"context_line":"        if value \u003c 0:"},{"line_number":409,"context_line":"            raise ValueError(\u0027offset must be non-negative\u0027)"},{"line_number":410,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"579a0f59_f0701f87","line":407,"updated":"2026-05-11 21:05:52.000000000","message":"this is doing a lot:\n\n```\n-        if int(value) !\u003d value:\n+        if not isinstance(value, int):\n```\n\nI\u0027m trying to decide if it\u0027s doing more than the idiomatic `isinstance`\n\nOMG python get bent:\n\n```\n\u003e\u003e\u003e isinstance(True, int)\nTrue\n```\n\n... one thing it might be trying to suggest is that it ensures `int(value)` below won\u0027t throwing away any information.\n\nthere may be some prior art to this spelling:\n\n```\n  swift/common/ring/composite_builder.py:141\n  if int(builder.replicas) !\u003d builder.replicas:\n      errors.append(\n          \u0027Non integer replica count %s found at index %s\u0027 %\n          (builder.replicas, index))\n```\n\n^ actually that\u0027s pointing at the right idea:\n\n\u003e float is *valid value* but not *supported type*","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    def _validate_offset(self, value):"},{"line_number":406,"context_line":"        if int(value) !\u003d value:"},{"line_number":407,"context_line":"            raise ValueError(\u0027offset must be an integer value\u0027)"},{"line_number":408,"context_line":"        if value \u003c 0:"},{"line_number":409,"context_line":"            raise ValueError(\u0027offset must be non-negative\u0027)"},{"line_number":410,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"8c84e3ac_b3d68d5e","line":407,"in_reply_to":"579a0f59_f0701f87","updated":"2026-05-12 10:15:21.000000000","message":"Acknowledged","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"}],"test/unit/common/utils/test_timestamp.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"765f2e80aa69115bc4ca7df930a389ad5800aec7","unresolved":true,"context_lines":[{"line_number":210,"context_line":"        # sanity check..."},{"line_number":211,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1)"},{"line_number":212,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":213,"context_line":"        # it\u0027s the value that matters, not the type..."},{"line_number":214,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1.0)"},{"line_number":215,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":216,"context_line":"        # only integer values are allowed..."}],"source_content_type":"text/x-python","patch_set":3,"id":"d792c85b_54c03479","line":213,"updated":"2026-04-28 22:21:40.000000000","message":"Huh. So... it\u0027s *intentional* that `t \u003d Timestamp.now(); t.offset\u003dt` will *sometimes* work? But `Timestamp.now(offset\u003dTimestamp.now())` will *always* raise a `TypeError`...","commit_id":"21a5cb4d12190cd2607f0ba1c8e07bc675fe421e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        # sanity check..."},{"line_number":211,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1)"},{"line_number":212,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":213,"context_line":"        # it\u0027s the value that matters, not the type..."},{"line_number":214,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1.0)"},{"line_number":215,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":216,"context_line":"        # only integer values are allowed..."}],"source_content_type":"text/x-python","patch_set":3,"id":"3344a310_95d8803d","line":213,"in_reply_to":"0b801aa4_927afc24","updated":"2026-05-12 10:15:21.000000000","message":"Done","commit_id":"21a5cb4d12190cd2607f0ba1c8e07bc675fe421e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"545711f4d71d5cdeb18851d979057f0f9d0ac6ae","unresolved":true,"context_lines":[{"line_number":210,"context_line":"        # sanity check..."},{"line_number":211,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1)"},{"line_number":212,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":213,"context_line":"        # it\u0027s the value that matters, not the type..."},{"line_number":214,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1.0)"},{"line_number":215,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":216,"context_line":"        # only integer values are allowed..."}],"source_content_type":"text/x-python","patch_set":3,"id":"0b801aa4_927afc24","line":213,"in_reply_to":"d792c85b_54c03479","updated":"2026-05-06 14:06:05.000000000","message":"Fixed","commit_id":"21a5cb4d12190cd2607f0ba1c8e07bc675fe421e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":true,"context_lines":[{"line_number":214,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003dTrue)"},{"line_number":215,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":216,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1.0)"},{"line_number":217,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":218,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, timestamp.Timestamp(1))"},{"line_number":219,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":220,"context_line":"        # only whole number values are allowed..."}],"source_content_type":"text/x-python","patch_set":4,"id":"baf8dbd6_c947285c","line":217,"updated":"2026-05-11 21:05:52.000000000","message":"\"test_offset_must_be_intger\" ... or some random other type that can cast to an integer with an equal value.","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003dTrue)"},{"line_number":215,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":216,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1.0)"},{"line_number":217,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":218,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, timestamp.Timestamp(1))"},{"line_number":219,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":220,"context_line":"        # only whole number values are allowed..."}],"source_content_type":"text/x-python","patch_set":4,"id":"486cd811_9b3dc6ea","line":217,"in_reply_to":"baf8dbd6_c947285c","updated":"2026-05-12 10:15:21.000000000","message":"Moot with the next patchset revision, but integer is not the python type ``int``, it\u0027s a number","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":true,"context_lines":[{"line_number":216,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1.0)"},{"line_number":217,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":218,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, timestamp.Timestamp(1))"},{"line_number":219,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":220,"context_line":"        # only whole number values are allowed..."},{"line_number":221,"context_line":"        with self.assertRaises(ValueError):"},{"line_number":222,"context_line":"            timestamp.Timestamp(1417462430.78693, offset\u003d1.1)"}],"source_content_type":"text/x-python","patch_set":4,"id":"42cc3cd0_98519116","line":219,"updated":"2026-05-11 21:05:52.000000000","message":"```\n        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003dTrue)\n        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)\n        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1.0)\n\u003e       self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)\n\nswift/test/unit/common/utils/test_timestamp.py:217: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself \u003d \u003c[TypeError(\u0027%x format: an integer is required, not float\u0027) raised in repr()] Timestamp object at 0x7f1f6c0260e0\u003e\n\n    @property\n    def internal(self):\n        if self.offset or FORCE_INTERNAL:\n\u003e           return INTERNAL_FORMAT % (self.timestamp, self.offset)\nE           TypeError: %x format: an integer is required, not float\n\nswift/swift/common/utils/timestamp.py:455: TypeError\n```\n\nmaster failed in some weird ways...","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003d1.0)"},{"line_number":217,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":218,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, timestamp.Timestamp(1))"},{"line_number":219,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":220,"context_line":"        # only whole number values are allowed..."},{"line_number":221,"context_line":"        with self.assertRaises(ValueError):"},{"line_number":222,"context_line":"            timestamp.Timestamp(1417462430.78693, offset\u003d1.1)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bc6eb6bf_1a2a77e0","line":219,"in_reply_to":"42cc3cd0_98519116","updated":"2026-05-12 10:15:21.000000000","message":"Acknowledged","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":true,"context_lines":[{"line_number":235,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":236,"context_line":"        ts.offset \u003d 2.0"},{"line_number":237,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000002\u0027, ts.internal)"},{"line_number":238,"context_line":"        ts.offset \u003d timestamp.Timestamp(3)"},{"line_number":239,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000003\u0027, ts.internal)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        # only whole number values are allowed..."}],"source_content_type":"text/x-python","patch_set":4,"id":"62aadc2f_f86962cf","line":238,"updated":"2026-05-11 21:05:52.000000000","message":"like this ... is not helpful\n\nI had to read it multiple times to even understand what\u0027s doing!  I know that the old code would allow this until it blew up, but I think this silent casting of the \"value\" will mask bugs.","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":true,"context_lines":[{"line_number":235,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":236,"context_line":"        ts.offset \u003d 2.0"},{"line_number":237,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000002\u0027, ts.internal)"},{"line_number":238,"context_line":"        ts.offset \u003d timestamp.Timestamp(3)"},{"line_number":239,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000003\u0027, ts.internal)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        # only whole number values are allowed..."}],"source_content_type":"text/x-python","patch_set":4,"id":"8495d6e8_5545d38c","line":238,"in_reply_to":"62aadc2f_f86962cf","updated":"2026-05-12 10:15:21.000000000","message":"Agree, fixed.","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":true,"context_lines":[{"line_number":252,"context_line":"        self.assertEqual(1, ts.offset)"},{"line_number":253,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        self.assertEqual(1, ts.increment_offset(0))"},{"line_number":256,"context_line":"        self.assertEqual(1, ts.offset)"},{"line_number":257,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"c2e9d0bf_125f1bd4","line":255,"updated":"2026-05-11 21:05:52.000000000","message":"```\n\u003e       self.assertEqual(1, ts.increment_offset(0))\nE       AssertionError: 1 !\u003d None\n\nswift/test/unit/common/utils/test_timestamp.py:255: AssertionError\n```","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        self.assertEqual(1, ts.offset)"},{"line_number":253,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        self.assertEqual(1, ts.increment_offset(0))"},{"line_number":256,"context_line":"        self.assertEqual(1, ts.offset)"},{"line_number":257,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"f8a0ce24_b20b506c","line":255,"in_reply_to":"c2e9d0bf_125f1bd4","updated":"2026-05-12 10:15:21.000000000","message":"Acknowledged","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25703e6fd3a7fc4017bc6724232db67be0f6261f","unresolved":true,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        self.assertEqual(7, ts.increment_offset(3.0))"},{"line_number":272,"context_line":"        self.assertEqual(7, ts.offset)"},{"line_number":273,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000007\u0027, ts.internal)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        self.assertEqual(12, ts.increment_offset(timestamp.Timestamp(5)))"},{"line_number":276,"context_line":"        self.assertEqual(12, ts.offset)"}],"source_content_type":"text/x-python","patch_set":4,"id":"d2641a72_fd66d04b","line":273,"updated":"2026-05-11 21:05:52.000000000","message":"```\n        self.assertEqual(7, ts.increment_offset(3.0))\n        self.assertEqual(7, ts.offset)\n\u003e       self.assertEqual(\u00271417462430.78693_0000000000000007\u0027, ts.internal)\n\nswift/test/unit/common/utils/test_timestamp.py:273: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself \u003d \u003c[TypeError(\u0027%x format: an integer is required, not float\u0027) raised in repr()] Timestamp object at 0x7f3dc43db250\u003e\n\n    @property\n    def internal(self):\n        if self.offset or FORCE_INTERNAL:\n\u003e           return INTERNAL_FORMAT % (self.timestamp, self.offset)\nE           TypeError: %x format: an integer is required, not float\n\nswift/swift/common/utils/timestamp.py:455: TypeError\n```\n???","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bd7e7f71f367d6d95f39c00b969afec9ac31948b","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        self.assertEqual(7, ts.increment_offset(3.0))"},{"line_number":272,"context_line":"        self.assertEqual(7, ts.offset)"},{"line_number":273,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000007\u0027, ts.internal)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        self.assertEqual(12, ts.increment_offset(timestamp.Timestamp(5)))"},{"line_number":276,"context_line":"        self.assertEqual(12, ts.offset)"}],"source_content_type":"text/x-python","patch_set":4,"id":"739e182b_f362c256","line":273,"in_reply_to":"d2641a72_fd66d04b","updated":"2026-05-12 10:15:21.000000000","message":"Acknowledged","commit_id":"864f81bdf0a39aa4e75eb2a61bfd2bcd25664556"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9d2a931210e0862b0b2232f2db6d01ee53698aab","unresolved":true,"context_lines":[{"line_number":195,"context_line":"        self.assertEqual(1, ts.offset)"},{"line_number":196,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        ts \u003d timestamp.Timestamp(1417462430.78693, offset\u003dTrue)"},{"line_number":199,"context_line":"        self.assertEqual(1, ts.offset)"},{"line_number":200,"context_line":"        self.assertEqual(\u00271417462430.78693_0000000000000001\u0027, ts.internal)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"38b718aa_366ff887","line":198,"updated":"2026-05-12 12:29:52.000000000","message":"ok, so even tho this is less obvious that python bools are ints, this doesn\u0027t blow up on master:\n\n```\n\u003e\u003e\u003e Timestamp(0, offset\u003dTrue).internal\n\u00270000000000.00000_0000000000000001\u0027\n```\n\nwhere as `offset\u003d1.0` maybe seems to make \"sense\", the difference is a \"whole number float\" was never \"supported\":\n\n```\n\u003e\u003e\u003e Timestamp(0, offset\u003d1.0).internal\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/vagrant/swift/swift/common/utils/timestamp.py\", line 455, in internal\n    return INTERNAL_FORMAT % (self.timestamp, self.offset)\nTypeError: %x format: an integer is required, not float\n```","commit_id":"33967853276f0987a58e5b3aca450173adadc064"}]}
