)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28473daea4335ee29192431467206f69647093c1","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"tests: new test_config module for utils.config"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Drive-by: fix ValueError message for non_negative_int"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I06508279d59fa57296dd85548f271a7812aeb45f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"8421fc37_bd11d024","line":9,"updated":"2024-05-23 19:02:35.000000000","message":"Might\u0027ve preferred these as separate changes, but it wasn\u0027t terrible to review.","commit_id":"a2df74ffe267565b7bb4af875141b73668388c39"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4ad570b480f356f7ff51a3ae919102bb490c9d60","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b6f7af4a_e003da87","updated":"2024-05-23 18:22:36.000000000","message":"I\u0027m only working on this so I can slightly modify error message raised by non_negative_int so I can use it to slightly simplify the validation of the expirer configuration which has a bug:\n\n920302: expirer: bad config should not loop forever | https://review.opendev.org/c/openstack/swift/+/920302\n\n... and I\u0027m only working on THAT because the bug came up while reviewing 918366: Parallel distirbuted task container iteration | https://review.opendev.org/c/openstack/swift/+/918366 which is what I\u0027m *really* trying to work on.","commit_id":"a2df74ffe267565b7bb4af875141b73668388c39"}],"swift/common/utils/config.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28473daea4335ee29192431467206f69647093c1","unresolved":true,"context_lines":[{"line_number":61,"context_line":"    :return: an int"},{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    int_value \u003d int(value)"},{"line_number":64,"context_line":"    if int_value !\u003d non_negative_float(value):"},{"line_number":65,"context_line":"        raise ValueError"},{"line_number":66,"context_line":"    return int_value"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1f5cce49_57c56e28","side":"PARENT","line":64,"updated":"2024-05-23 19:02:35.000000000","message":"Yeah, that *was* a weird way to spell it...","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28473daea4335ee29192431467206f69647093c1","unresolved":true,"context_lines":[{"line_number":1766,"context_line":"                          utils.load_libc_function, \u0027some_not_real_function\u0027,"},{"line_number":1767,"context_line":"                          fail_if_missing\u003dTrue)"},{"line_number":1768,"context_line":""},{"line_number":1769,"context_line":"    def test_readconf(self):"},{"line_number":1770,"context_line":"        conf \u003d \u0027\u0027\u0027[section1]"},{"line_number":1771,"context_line":"foo \u003d bar"},{"line_number":1772,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"53d8c1eb_20a2020a","side":"PARENT","line":1769,"updated":"2024-05-23 19:02:35.000000000","message":"```\ndiff \u003c( git show @~:test/unit/common/test_utils.py | sed -e \u00271769,1919!d\u0027 ) \\\n     \u003c( git show @:test/unit/common/utils/test_config.py | sed -e \u0027582,731!d\u0027 )\n```\nJust `utils` vs `config` namespacing differences.","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28473daea4335ee29192431467206f69647093c1","unresolved":true,"context_lines":[{"line_number":2426,"context_line":"                                badurl, [\u00271.1.1.1\u0027, \u00272.2.2.2\u0027], realms_conf),"},{"line_number":2427,"context_line":"                            result)"},{"line_number":2428,"context_line":""},{"line_number":2429,"context_line":"    def test_TRUE_VALUES(self):"},{"line_number":2430,"context_line":"        for v in utils.TRUE_VALUES:"},{"line_number":2431,"context_line":"            self.assertEqual(v, v.lower())"},{"line_number":2432,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"02e3cab2_e0b8a8c3","side":"PARENT","line":2429,"updated":"2024-05-23 19:02:35.000000000","message":"```\ndiff \u003c( git show @~:test/unit/common/test_utils.py | sed -e \u00272429,2641!d\u0027 | sed -e \u0027s/utils[.]/config./\u0027 ) \\\n     \u003c( git show @:test/unit/common/utils/test_config.py | sed -e \u002733,264!d\u0027 )\n```\nLooks to be mostly just making tighter assertions around `non_negative_int` error messages, as already called out.","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4ad570b480f356f7ff51a3ae919102bb490c9d60","unresolved":true,"context_lines":[{"line_number":2482,"context_line":"        with self.assertRaises(ValueError):"},{"line_number":2483,"context_line":"            utils.non_negative_int(\u0027-1\u0027)"},{"line_number":2484,"context_line":"        with self.assertRaises(ValueError):"},{"line_number":2485,"context_line":"            utils.non_negative_int(\u0027-1.1\u0027)"},{"line_number":2486,"context_line":"        with self.assertRaises(ValueError):"},{"line_number":2487,"context_line":"            utils.non_negative_int(\u00271.1\u0027)"},{"line_number":2488,"context_line":"        with self.assertRaises(ValueError):"}],"source_content_type":"text/x-python","patch_set":2,"id":"332dd61b_69eaab67","side":"PARENT","line":2485,"updated":"2024-05-23 18:22:36.000000000","message":"had this existing test made an assertions about the message contained in this ValueError it might have been surprising that it claimed:\n\n    Value must be a non-negative float number\n    \n... since we actually required an integer","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28473daea4335ee29192431467206f69647093c1","unresolved":true,"context_lines":[{"line_number":2765,"context_line":"        ts \u003d utils.get_trans_id_time(\u0027tx1df4ff4f55ea45f7b2ec2-almostright\u0027)"},{"line_number":2766,"context_line":"        self.assertIsNone(ts)"},{"line_number":2767,"context_line":""},{"line_number":2768,"context_line":"    def test_config_fallocate_value(self):"},{"line_number":2769,"context_line":"        fallocate_value, is_percent \u003d utils.config_fallocate_value(\u002710%\u0027)"},{"line_number":2770,"context_line":"        self.assertEqual(fallocate_value, 10)"},{"line_number":2771,"context_line":"        self.assertTrue(is_percent)"}],"source_content_type":"text/x-python","patch_set":2,"id":"2d2024b9_ac0a4a53","side":"PARENT","line":2768,"updated":"2024-05-23 19:02:35.000000000","message":"```\ndiff \u003c( git show @~:test/unit/common/test_utils.py | sed -e \u00272768,2805!d\u0027 | sed -e \u0027s/utils[.]/config./\u0027 ) \\\n     \u003c( git show @:test/unit/common/utils/test_config.py | sed -e \u0027265,302!d\u0027 )\n```\nComes back clean.","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28473daea4335ee29192431467206f69647093c1","unresolved":true,"context_lines":[{"line_number":4192,"context_line":"            TypeError, md5, None, usedforsecurity\u003dFalse)"},{"line_number":4193,"context_line":""},{"line_number":4194,"context_line":""},{"line_number":4195,"context_line":"class ResellerConfReader(unittest.TestCase):"},{"line_number":4196,"context_line":""},{"line_number":4197,"context_line":"    def setUp(self):"},{"line_number":4198,"context_line":"        self.default_rules \u003d {\u0027operator_roles\u0027: [\u0027admin\u0027, \u0027swiftoperator\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"83690061_b352b4bf","side":"PARENT","line":4195,"updated":"2024-05-23 19:02:35.000000000","message":"```\ndiff \u003c( git show @~:test/unit/common/test_utils.py | sed -e \u00274195,4374!d\u0027 | sed -e \u0027s/utils[.]/config./\u0027 ) \\\n     \u003c( git show @:test/unit/common/utils/test_config.py | sed -e \u0027304,483!d\u0027 )\n```\nComes back clean.","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28473daea4335ee29192431467206f69647093c1","unresolved":true,"context_lines":[{"line_number":4639,"context_line":"    __next__ \u003d next"},{"line_number":4640,"context_line":""},{"line_number":4641,"context_line":""},{"line_number":4642,"context_line":"class TestAffinityKeyFunction(unittest.TestCase):"},{"line_number":4643,"context_line":"    def setUp(self):"},{"line_number":4644,"context_line":"        self.nodes \u003d [dict(id\u003d0, region\u003d1, zone\u003d1),"},{"line_number":4645,"context_line":"                      dict(id\u003d1, region\u003d1, zone\u003d2),"}],"source_content_type":"text/x-python","patch_set":2,"id":"c774d7e1_12a42754","side":"PARENT","line":4642,"updated":"2024-05-23 19:02:35.000000000","message":"```\ndiff \u003c( git show @~:test/unit/common/test_utils.py | sed -e \u00274642,4737!d\u0027 | sed -e \u0027s/utils[.]/config./\u0027 ) \\\n     \u003c( git show @:test/unit/common/utils/test_config.py | sed -e \u0027484,579!d\u0027 )\n```\nComes back clean.","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"}],"test/unit/common/utils/test_config.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4ad570b480f356f7ff51a3ae919102bb490c9d60","unresolved":true,"context_lines":[{"line_number":82,"context_line":"        self.assertEqual(0, config.non_negative_int(False))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        with self.assertRaises(ValueError) as cm:"},{"line_number":85,"context_line":"            config.non_negative_int(-1)"},{"line_number":86,"context_line":"        self.assertEqual("},{"line_number":87,"context_line":"            \u0027Value must be a non-negative integer, not \"-1\".\u0027,"},{"line_number":88,"context_line":"            str(cm.exception))"}],"source_content_type":"text/x-python","patch_set":2,"id":"458430a9_da439214","line":85,"updated":"2024-05-23 18:22:36.000000000","message":"Since it\u0027s in \"config\" module, this method is mostly for handling strings - the behavior for floats and ints is mostly just relevant in tests where we pass in config dicts and using real python literals is sometimes more convienent.\n\nWe could add more tests about the behavior of this method when you give it `2.0` and `1.1` and `-1.675` but I think they\u0027d *mostly* just be observational since the config module doesn\u0027t have any explicit requirements.","commit_id":"a2df74ffe267565b7bb4af875141b73668388c39"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4ad570b480f356f7ff51a3ae919102bb490c9d60","unresolved":true,"context_lines":[{"line_number":95,"context_line":"            config.non_negative_int(\u0027-1.1\u0027)"},{"line_number":96,"context_line":"        self.assertEqual("},{"line_number":97,"context_line":"            \u0027Value must be a non-negative integer, not \"-1.1\".\u0027,"},{"line_number":98,"context_line":"            str(cm.exception))"},{"line_number":99,"context_line":"        with self.assertRaises(ValueError) as cm:"},{"line_number":100,"context_line":"            config.non_negative_int(\u00271.1\u0027)"},{"line_number":101,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":2,"id":"1e0b05ae_78a80abd","line":98,"updated":"2024-05-23 18:22:36.000000000","message":"I guess *maybe* I could imagine a bug where `\u0027-1.1\u0027` is an error but `-1.1` is NOT; might be worth asserting we raise a ValueError on negative float.\n\n920309: test: more assertion on non_negative_int | https://review.opendev.org/c/openstack/swift/+/920309","commit_id":"a2df74ffe267565b7bb4af875141b73668388c39"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4ad570b480f356f7ff51a3ae919102bb490c9d60","unresolved":true,"context_lines":[{"line_number":5958,"context_line":""},{"line_number":5959,"context_line":"        reconstructor \u003d object_reconstructor.ObjectReconstructor("},{"line_number":5960,"context_line":"            {\u0027quarantine_threshold\u0027: 2.0})"},{"line_number":5961,"context_line":"        self.assertEqual(2, reconstructor.quarantine_threshold)"},{"line_number":5962,"context_line":""},{"line_number":5963,"context_line":"        for bad in (\u00271.1\u0027, 1.1, \u0027-1\u0027, -1, \u0027auto\u0027, \u0027bad\u0027):"},{"line_number":5964,"context_line":"            with annotate_failure(bad):"}],"source_content_type":"text/x-python","patch_set":2,"id":"2ed6e302_a759a3c3","side":"PARENT","line":5961,"updated":"2024-05-23 18:22:36.000000000","message":"FWIW `int(\u00271.1\u0027)` will blow up; while `int(1.1)` will truncate.\n\nthe existing `config.non_negative_int` seemed to already allow you to pass *some* floats - but `quarantine_threshold \u003d 2.0` would never have been valid in a config:\n\n```\nvagrant@saio:~$ swift-object-reconstructor /etc/swift/object-server/1.conf.d/ once verbose\nobject-6010: Starting 7320\nTraceback (most recent call last):\n  File \"/usr/local/bin/swift-object-reconstructor\", line 7, in \u003cmodule\u003e\n    exec(compile(f.read(), __file__, \u0027exec\u0027))\n  File \"/vagrant/swift/bin/swift-object-reconstructor\", line 33, in \u003cmodule\u003e\n    run_daemon(ObjectReconstructor, conf_file, **options)\n  File \"/vagrant/swift/swift/common/daemon.py\", line 330, in run_daemon\n    d \u003d klass(conf)\n  File \"/vagrant/swift/swift/obj/reconstructor.py\", line 232, in __init__\n    self.quarantine_threshold \u003d non_negative_int(\n  File \"/vagrant/swift/swift/common/utils/config.py\", line 63, in non_negative_int\n    int_value \u003d int(value)\nValueError: invalid literal for int() with base 10: \u00272.0\u0027\n```","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4ad570b480f356f7ff51a3ae919102bb490c9d60","unresolved":true,"context_lines":[{"line_number":5960,"context_line":"            {\u0027quarantine_threshold\u0027: 2.0})"},{"line_number":5961,"context_line":"        self.assertEqual(2, reconstructor.quarantine_threshold)"},{"line_number":5962,"context_line":""},{"line_number":5963,"context_line":"        for bad in (\u00271.1\u0027, 1.1, \u0027-1\u0027, -1, \u0027auto\u0027, \u0027bad\u0027):"},{"line_number":5964,"context_line":"            with annotate_failure(bad):"},{"line_number":5965,"context_line":"                with self.assertRaises(ValueError):"},{"line_number":5966,"context_line":"                    object_reconstructor.ObjectReconstructor("}],"source_content_type":"text/x-python","patch_set":2,"id":"e10feb99_4a388352","side":"PARENT","line":5963,"updated":"2024-05-23 18:22:36.000000000","message":"We could absolutely write more code in `config.non_negative_int` to make a litteral float always error - the existing `if int(v) !\u003d non_negative_float(v): raise ValueError` was strange and not very descriptive but accomplished just that!\n\nOr we could go the other way, and add a test in `test_config.py` that verifies `config.non_negative_int` will always tuncate floats?  Perhaps a more consistent behavior given the assertion above about `2.0`\n\nEther way I this assertRaises ValueError on `1.1` was just opppertunistic - and it doesn\u0027t need to be here.","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28473daea4335ee29192431467206f69647093c1","unresolved":true,"context_lines":[{"line_number":5960,"context_line":"            {\u0027quarantine_threshold\u0027: 2.0})"},{"line_number":5961,"context_line":"        self.assertEqual(2, reconstructor.quarantine_threshold)"},{"line_number":5962,"context_line":""},{"line_number":5963,"context_line":"        for bad in (\u00271.1\u0027, 1.1, \u0027-1\u0027, -1, \u0027auto\u0027, \u0027bad\u0027):"},{"line_number":5964,"context_line":"            with annotate_failure(bad):"},{"line_number":5965,"context_line":"                with self.assertRaises(ValueError):"},{"line_number":5966,"context_line":"                    object_reconstructor.ObjectReconstructor("}],"source_content_type":"text/x-python","patch_set":2,"id":"15921c35_24b771a0","side":"PARENT","line":5963,"in_reply_to":"e10feb99_4a388352","updated":"2024-05-23 19:02:35.000000000","message":"I\u0027d be partial towards removing the `-1` case, too (while keeping the `\u0027-1\u0027` case).","commit_id":"c620a192d0db733dbb90c71d3c9a7c5f3eba3e56"}]}
