)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0af9e72409d5851407094d69a29a5fdfc75629cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"febca280_d2fedee2","updated":"2023-04-05 11:03:21.000000000","message":"good idea to add some tests first. py2.7 is problematic (of course!)","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5b7aa9183457c5e5ae5f661fadb14d102cb7549e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"47773882_dc3d842d","updated":"2023-04-10 18:01:06.000000000","message":"i was worried some of the tests were maybe not very clear, and they exposed some differences I forgotten about and some I didn\u0027t even know we had!  The difference in behavior with configparser between py2 and py3 thing will be annoying to explain","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dcd485014171cb9d9f9f6e831418587c0be55786","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ae9789d5_b2202955","updated":"2023-04-10 21:18:42.000000000","message":"we could re-spin to fix the doc-string, but it\u0027s not a blocker for me.\n\nIt was really only to make testing easier (maybe there\u0027d be a better way to do it?)","commit_id":"e6049b577184ed0e5ea1a96f91585f84af3329f8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"794aca6c5c67ecdf1b10ae4bbc39a91c74760fe0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"e6a2539d_816a3f35","updated":"2023-04-11 21:43:11.000000000","message":"i\u0027ll re-spin when I fix the follow-on commit message","commit_id":"d7d1c1532be4087a4acad113a967f4c3a3f39ded"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2b215197dbd05db33cbdc96ec059748209dd0a66","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"6a8e268e_50dbc49b","updated":"2023-04-14 19:24:45.000000000","message":"i think the material change here is just for testing and safe to merge and maybe also helpful for mainteance.","commit_id":"74cc6e5d5bdc27a97a85e86ec4f5ca73e030bf29"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"12e631cc9b6463ddff575b45d57cbdfd70426c10","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"494d7f8b_b58f18aa","updated":"2023-04-14 19:55:28.000000000","message":"let me try this again.","commit_id":"74cc6e5d5bdc27a97a85e86ec4f5ca73e030bf29"}],"swift/common/daemon.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"30e9ddda564f5c59412ed68dee89f6aaa23417ae","unresolved":true,"context_lines":[{"line_number":267,"context_line":"    :param conf_file: Path to configuration file"},{"line_number":268,"context_line":"    :param section_name: Section name from conf file to load config from"},{"line_number":269,"context_line":"    :param once: Passed to daemon :meth:`Daemon.run` method"},{"line_number":270,"context_line":"    \"\"\""},{"line_number":271,"context_line":"    # very often the config section_name is based on the class name"},{"line_number":272,"context_line":"    # the None singleton will be passed through to readconf as is"},{"line_number":273,"context_line":"    if section_name \u003d\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1d8db6c8_d80c989c","line":270,"updated":"2023-04-10 20:22:53.000000000","message":"Could use updating:\n\n    :returns: the instantiated :class:`Daemon`\n\nThis seems out-of scope for the change, though -- was it supposed to go in the next patch in the chain?","commit_id":"e6049b577184ed0e5ea1a96f91585f84af3329f8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7d1bae2c96edd2c17dd9d26ff2ca524b6090845a","unresolved":true,"context_lines":[{"line_number":320,"context_line":"    except KeyboardInterrupt:"},{"line_number":321,"context_line":"        logger.info(\u0027User quit\u0027)"},{"line_number":322,"context_line":"    logger.notice(\u0027Exited %s\u0027, os.getpid())"},{"line_number":323,"context_line":"    return d"}],"source_content_type":"text/x-python","patch_set":3,"id":"bca6089c_8aa4f78e","line":323,"updated":"2023-04-10 20:29:55.000000000","message":"Just looked ahead in the chain -- nothing seems to use this. Why are we doing it? Why would we want the daemon after it\u0027s already exited?","commit_id":"e6049b577184ed0e5ea1a96f91585f84af3329f8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0867d7a40a447b546e09d5ef6c9904cc9d531c3a","unresolved":false,"context_lines":[{"line_number":320,"context_line":"    except KeyboardInterrupt:"},{"line_number":321,"context_line":"        logger.info(\u0027User quit\u0027)"},{"line_number":322,"context_line":"    logger.notice(\u0027Exited %s\u0027, os.getpid())"},{"line_number":323,"context_line":"    return d"}],"source_content_type":"text/x-python","patch_set":3,"id":"e12af42a_41cb7dca","line":323,"in_reply_to":"bca6089c_8aa4f78e","updated":"2023-04-11 14:54:51.000000000","message":"Nah, I\u0027m just wrong.","commit_id":"e6049b577184ed0e5ea1a96f91585f84af3329f8"}],"test/unit/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"30e9ddda564f5c59412ed68dee89f6aaa23417ae","unresolved":true,"context_lines":[{"line_number":1416,"context_line":"    \"\"\""},{"line_number":1417,"context_line":"    def assertDuplicateOption(self, app_config, option_name, option_value):"},{"line_number":1418,"context_line":"        \"\"\""},{"line_number":1419,"context_line":"        PY3 added a DuplicateOptionError, PY2 didn\u0027t seem to care"},{"line_number":1420,"context_line":"        \"\"\""},{"line_number":1421,"context_line":"        if six.PY3:"},{"line_number":1422,"context_line":"            self.assertDuplicateOptionError(app_config, option_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"95ab3364_6c233d3d","line":1419,"updated":"2023-04-10 20:22:53.000000000","message":"Well, *that\u0027s* unfortunate and annoying...\n\nCan we be more prescriptive rather than descriptive? What do we *want* the behavior to be?\n\nGut feeling: I prefer the py3 way, and I doubt we have users relying on the py2 mode (or we would\u0027ve heard from them by now) -- so I\u0027d be partial toward having calling code have a guard like\n\n    if not six.PY2:\n        # py2 allowed duplicates, for dubious reasons\n        self.assertDuplicateOptionError(...)\n\nthat we can then clean up quickly/easily when we rip out py2 support.","commit_id":"e6049b577184ed0e5ea1a96f91585f84af3329f8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"12e631cc9b6463ddff575b45d57cbdfd70426c10","unresolved":true,"context_lines":[{"line_number":1416,"context_line":"    \"\"\""},{"line_number":1417,"context_line":"    def assertDuplicateOption(self, app_config, option_name, option_value):"},{"line_number":1418,"context_line":"        \"\"\""},{"line_number":1419,"context_line":"        PY3 added a DuplicateOptionError, PY2 didn\u0027t seem to care"},{"line_number":1420,"context_line":"        \"\"\""},{"line_number":1421,"context_line":"        if six.PY3:"},{"line_number":1422,"context_line":"            self.assertDuplicateOptionError(app_config, option_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"c771f9ea_b50738fd","line":1419,"in_reply_to":"95ab3364_6c233d3d","updated":"2023-04-14 19:55:28.000000000","message":"well, since I want to change the behavior I want to demonstrate some of the differences in how configs ARE parsed with out being judgemental.  It\u0027s been useful to me to have asserts around both py2 and py3.","commit_id":"e6049b577184ed0e5ea1a96f91585f84af3329f8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"12e631cc9b6463ddff575b45d57cbdfd70426c10","unresolved":true,"context_lines":[{"line_number":1428,"context_line":"                utils.configparser.DuplicateOptionError) as ctx:"},{"line_number":1429,"context_line":"            app_config()"},{"line_number":1430,"context_line":"        msg \u003d str(ctx.exception)"},{"line_number":1431,"context_line":"        self.assertIn(\u0027client_timeout\u0027, msg)"},{"line_number":1432,"context_line":"        self.assertIn(\u0027already exists\u0027, msg)"},{"line_number":1433,"context_line":""},{"line_number":1434,"context_line":"    def assertDuplicateOptionOK(self, app_config, option_name, option_value):"}],"source_content_type":"text/x-python","patch_set":5,"id":"2383e891_f8521189","line":1431,"updated":"2023-04-14 19:55:28.000000000","message":"this was a bug - i missed it during a refactor - I wanted the assert to be on the passed in option_name","commit_id":"74cc6e5d5bdc27a97a85e86ec4f5ca73e030bf29"}],"test/unit/common/test_daemon.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0af9e72409d5851407094d69a29a5fdfc75629cd","unresolved":true,"context_lines":[{"line_number":209,"context_line":"            time.tzset()"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    @with_tempdir"},{"line_number":212,"context_line":"    def test_run_deamon_from_conf_file(self, tempdir):"},{"line_number":213,"context_line":"        conf_path \u003d os.path.join(tempdir, \u0027test-daemon.conf\u0027)"},{"line_number":214,"context_line":"        conf_body \u003d \"\"\""},{"line_number":215,"context_line":"        [DEFAULT]"}],"source_content_type":"text/x-python","patch_set":2,"id":"6fdcb7fc_63106a9d","line":212,"range":{"start_line":212,"start_character":17,"end_line":212,"end_character":23},"updated":"2023-04-05 11:03:21.000000000","message":"nit: s/deamon/daemon/ throughout","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5b7aa9183457c5e5ae5f661fadb14d102cb7549e","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            time.tzset()"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    @with_tempdir"},{"line_number":212,"context_line":"    def test_run_deamon_from_conf_file(self, tempdir):"},{"line_number":213,"context_line":"        conf_path \u003d os.path.join(tempdir, \u0027test-daemon.conf\u0027)"},{"line_number":214,"context_line":"        conf_body \u003d \"\"\""},{"line_number":215,"context_line":"        [DEFAULT]"}],"source_content_type":"text/x-python","patch_set":2,"id":"2b716486_18537ae4","line":212,"range":{"start_line":212,"start_character":17,"end_line":212,"end_character":23},"in_reply_to":"6fdcb7fc_63106a9d","updated":"2023-04-10 18:01:06.000000000","message":"Done","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0af9e72409d5851407094d69a29a5fdfc75629cd","unresolved":true,"context_lines":[{"line_number":224,"context_line":"            f.write(contents)"},{"line_number":225,"context_line":"        with mock.patch(\u0027swift.common.daemon.use_hub\u0027):"},{"line_number":226,"context_line":"            d \u003d daemon.run_daemon(MyDaemon, conf_path)"},{"line_number":227,"context_line":"        # my-daemon section takes priority (!?)"},{"line_number":228,"context_line":"        self.assertEqual(\u00272\u0027, d.conf[\u0027client_timeout\u0027])"},{"line_number":229,"context_line":"        self.assertEqual(\u002710\u0027, d.conf[\u0027conn_timeout\u0027])"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5061461c_3aadddaa","line":227,"range":{"start_line":227,"start_character":43,"end_line":227,"end_character":47},"updated":"2023-04-05 11:03:21.000000000","message":"this assertion didn\u0027t surprise me, should it have?\n\nupdate: OIC, PasteDeploy has different precedence","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0af9e72409d5851407094d69a29a5fdfc75629cd","unresolved":true,"context_lines":[{"line_number":229,"context_line":"        self.assertEqual(\u002710\u0027, d.conf[\u0027conn_timeout\u0027])"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @with_tempdir"},{"line_number":232,"context_line":"    def test_run_deamon_from_conf_file_with_duplicate_var(self, tempdir):"},{"line_number":233,"context_line":"        conf_path \u003d os.path.join(tempdir, \u0027test-daemon.conf\u0027)"},{"line_number":234,"context_line":"        conf_body \u003d \"\"\""},{"line_number":235,"context_line":"        [DEFAULT]"}],"source_content_type":"text/x-python","patch_set":2,"id":"2adcebe9_835b2512","line":232,"updated":"2023-04-05 11:03:21.000000000","message":"not sure duplicate is disallowed under py2.7:\n\n```\nstrict, default value: True\n\nWhen set to True, the parser will not allow for any section or option duplicates while reading from a single source (using read_file(), read_string() or read_dict()). It is recommended to use strict parsers in new applications.\n\nChanged in version 3.2: In previous versions of configparser behaviour matched strict\u003dFalse.\n```\n\nhttps://docs.python.org/3/library/configparser.html\n\n\nConfirmed on py2.7 duplicate IS allowed:\n\n```\n@with_tempdir\n    def test_run_deamon_from_conf_file_with_duplicate_var(self, tempdir):\n        conf_path \u003d os.path.join(tempdir, \u0027test-daemon.conf\u0027)\n        conf_body \u003d \"\"\"\n        [DEFAULT]\n        client_timeout \u003d 3\n        [my-daemon]\n        CLIENT_TIMEOUT \u003d 2\n        client_timeout \u003d 1\n        \"\"\"\n        contents \u003d dedent(conf_body)\n        with open(conf_path, \u0027w\u0027) as f:\n            f.write(contents)\n        with mock.patch(\u0027swift.common.daemon.use_hub\u0027):\n            d \u003d daemon.run_daemon(MyDaemon, tempdir)\n        self.assertEqual(\u00271\u0027, d.conf[\u0027client_timeout\u0027])\n        ```","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0af9e72409d5851407094d69a29a5fdfc75629cd","unresolved":true,"context_lines":[{"line_number":242,"context_line":"        with open(conf_path, \u0027w\u0027) as f:"},{"line_number":243,"context_line":"            f.write(contents)"},{"line_number":244,"context_line":"        with self.assertRaises("},{"line_number":245,"context_line":"                utils.configparser.DuplicateOptionError) as ctx:"},{"line_number":246,"context_line":"            daemon.run_daemon(MyDaemon, tempdir)"},{"line_number":247,"context_line":"        msg \u003d str(ctx.exception)"},{"line_number":248,"context_line":"        self.assertIn(\u0027client_timeout\u0027, msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"184ef344_6406a95e","line":245,"updated":"2023-04-05 11:03:21.000000000","message":"zuul says (py2.7)\n\n```\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d FAILURES \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n________ TestRunDaemon.test_run_deamon_from_conf_dir_with_duplicate_var ________\n\nargs \u003d [\u003ctest.unit.common.test_daemon.TestRunDaemon testMethod\u003dtest_run_deamon_from_conf_dir_with_duplicate_var\u003e, \u0027/home/zuul/xfstmp/tmp2P5s8x\u0027]\nkwargs \u003d {}, tempdir \u003d \u0027/home/zuul/xfstmp/tmp2P5s8x\u0027\n\n    @functools.wraps(f)\n    def wrapped(*args, **kwargs):\n        tempdir \u003d mkdtemp()\n        args \u003d list(args)\n        args.append(tempdir)\n        try:\n\u003e           return f(*args, **kwargs)\n\ntest/unit/__init__.py:563: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself \u003d \u003ctest.unit.common.test_daemon.TestRunDaemon testMethod\u003dtest_run_deamon_from_conf_dir_with_duplicate_var\u003e\ntempdir \u003d \u0027/home/zuul/xfstmp/tmp2P5s8x\u0027\n\n    @with_tempdir\n    def test_run_deamon_from_conf_dir_with_duplicate_var(self, tempdir):\n        conf_files \u003d {\n            \u0027default\u0027: \"\"\"\n            [DEFAULT]\n            client_timeout \u003d 3\n            \"\"\",\n            \u0027daemon\u0027: \"\"\"\n            [my-daemon]\n            client_timeout \u003d 2\n            CLIENT_TIMEOUT \u003d 1\n            \"\"\",\n        }\n        for filename, conf_body in conf_files.items():\n            path \u003d os.path.join(tempdir, filename + \u0027.conf\u0027)\n            with open(path, \u0027wt\u0027) as fd:\n                fd.write(dedent(conf_body))\n        with mock.patch(\u0027swift.common.daemon.use_hub\u0027):\n            with self.assertRaises(\n\u003e                   utils.configparser.DuplicateOptionError) as ctx:\nE                   AttributeError: \u0027module\u0027 object has no attribute \u0027DuplicateOptionError\u0027\n\ntest/unit/common/test_daemon.py:297: AttributeError\n```","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5b7aa9183457c5e5ae5f661fadb14d102cb7549e","unresolved":true,"context_lines":[{"line_number":242,"context_line":"        with open(conf_path, \u0027w\u0027) as f:"},{"line_number":243,"context_line":"            f.write(contents)"},{"line_number":244,"context_line":"        with self.assertRaises("},{"line_number":245,"context_line":"                utils.configparser.DuplicateOptionError) as ctx:"},{"line_number":246,"context_line":"            daemon.run_daemon(MyDaemon, tempdir)"},{"line_number":247,"context_line":"        msg \u003d str(ctx.exception)"},{"line_number":248,"context_line":"        self.assertIn(\u0027client_timeout\u0027, msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d2080f27_b2aa336c","line":245,"in_reply_to":"184ef344_6406a95e","updated":"2023-04-10 18:01:06.000000000","message":"sweet!  i get to try out https://github.com/NVIDIA/vagrant-swift-all-in-one/pull/138 #willfix","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0af9e72409d5851407094d69a29a5fdfc75629cd","unresolved":true,"context_lines":[{"line_number":246,"context_line":"            daemon.run_daemon(MyDaemon, tempdir)"},{"line_number":247,"context_line":"        msg \u003d str(ctx.exception)"},{"line_number":248,"context_line":"        self.assertIn(\u0027client_timeout\u0027, msg)"},{"line_number":249,"context_line":"        self.assertIn(\u0027already exists\u0027, msg)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @with_tempdir"},{"line_number":252,"context_line":"    def test_run_deamon_from_conf_dir(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":2,"id":"f9db8eb0_f63859c7","line":249,"updated":"2023-04-05 11:03:21.000000000","message":"oh, interesting! duplicate allowed w.r.t. DEFAULT but not within section","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5b7aa9183457c5e5ae5f661fadb14d102cb7549e","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            daemon.run_daemon(MyDaemon, tempdir)"},{"line_number":247,"context_line":"        msg \u003d str(ctx.exception)"},{"line_number":248,"context_line":"        self.assertIn(\u0027client_timeout\u0027, msg)"},{"line_number":249,"context_line":"        self.assertIn(\u0027already exists\u0027, msg)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @with_tempdir"},{"line_number":252,"context_line":"    def test_run_deamon_from_conf_dir(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":2,"id":"46c152e1_f21d6d9f","line":249,"in_reply_to":"f9db8eb0_f63859c7","updated":"2023-04-10 18:01:06.000000000","message":"Ack","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dcd485014171cb9d9f9f6e831418587c0be55786","unresolved":true,"context_lines":[{"line_number":226,"context_line":"            d \u003d daemon.run_daemon(MyDaemon, conf_path)"},{"line_number":227,"context_line":"        # my-daemon section takes priority (!?)"},{"line_number":228,"context_line":"        self.assertEqual(\u00272\u0027, d.conf[\u0027client_timeout\u0027])"},{"line_number":229,"context_line":"        self.assertEqual(\u002710\u0027, d.conf[\u0027conn_timeout\u0027])"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @with_tempdir"},{"line_number":232,"context_line":"    def test_run_daemon_from_conf_file_with_duplicate_var(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":3,"id":"320a1814_2dd73885","line":229,"updated":"2023-04-10 21:18:42.000000000","message":"hey tim, this is where I use the return","commit_id":"e6049b577184ed0e5ea1a96f91585f84af3329f8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0867d7a40a447b546e09d5ef6c9904cc9d531c3a","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            d \u003d daemon.run_daemon(MyDaemon, conf_path)"},{"line_number":227,"context_line":"        # my-daemon section takes priority (!?)"},{"line_number":228,"context_line":"        self.assertEqual(\u00272\u0027, d.conf[\u0027client_timeout\u0027])"},{"line_number":229,"context_line":"        self.assertEqual(\u002710\u0027, d.conf[\u0027conn_timeout\u0027])"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @with_tempdir"},{"line_number":232,"context_line":"    def test_run_daemon_from_conf_file_with_duplicate_var(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ec846170_e4976a38","line":229,"in_reply_to":"320a1814_2dd73885","updated":"2023-04-11 14:54:51.000000000","message":"😳 I must\u0027ve gotten confused and gone grepping for `run_server` instead of `run_daemon`","commit_id":"e6049b577184ed0e5ea1a96f91585f84af3329f8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6baf48ddaf178ea7d3ef0ecdd3ad1caf495cce8d","unresolved":true,"context_lines":[{"line_number":291,"context_line":"                fd.write(dedent(conf_body))"},{"line_number":292,"context_line":"        with mock.patch(\u0027swift.common.daemon.use_hub\u0027):"},{"line_number":293,"context_line":"            app_config \u003d lambda: daemon.run_daemon(MyDaemon, tempdir)"},{"line_number":294,"context_line":"            self.assertDuplicateOption(app_config, \u0027client_timeout\u0027, \u00274\u0027)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    @contextmanager"},{"line_number":297,"context_line":"    def mock_os(self, child_worker_cycles\u003d3):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9d9e2e0b_8f913546","line":294,"updated":"2023-04-14 20:02:11.000000000","message":"here it seems py2 picked 4","commit_id":"74cc6e5d5bdc27a97a85e86ec4f5ca73e030bf29"}],"test/unit/common/test_wsgi.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0af9e72409d5851407094d69a29a5fdfc75629cd","unresolved":true,"context_lines":[{"line_number":148,"context_line":"        app \u003d wsgi.loadapp(conf_path)"},{"line_number":149,"context_line":"        self.assertIsInstance(app, obj_server.ObjectController)"},{"line_number":150,"context_line":"        self.assertTrue(isinstance(app, obj_server.ObjectController))"},{"line_number":151,"context_line":"        self.assertEqual(1, app.client_timeout)"},{"line_number":152,"context_line":"        self.assertEqual(5, app.conn_timeout)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @with_tempdir"}],"source_content_type":"text/x-python","patch_set":2,"id":"0a576f53_b970f279","line":151,"updated":"2023-04-05 11:03:21.000000000","message":"oh goodness! yep, IIRC in paste deploy we have to use \u0027set client_timeout \u003d 2\u0027 to override the DEFAULT","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5b7aa9183457c5e5ae5f661fadb14d102cb7549e","unresolved":true,"context_lines":[{"line_number":148,"context_line":"        app \u003d wsgi.loadapp(conf_path)"},{"line_number":149,"context_line":"        self.assertIsInstance(app, obj_server.ObjectController)"},{"line_number":150,"context_line":"        self.assertTrue(isinstance(app, obj_server.ObjectController))"},{"line_number":151,"context_line":"        self.assertEqual(1, app.client_timeout)"},{"line_number":152,"context_line":"        self.assertEqual(5, app.conn_timeout)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @with_tempdir"}],"source_content_type":"text/x-python","patch_set":2,"id":"7204a4f3_400e1f98","line":151,"in_reply_to":"0a576f53_b970f279","updated":"2023-04-10 18:01:06.000000000","message":"yeah I think that shows up in another test, and I don\u0027t think I\u0027m going to add some of these weird paste-isms to our daemon config parsing code - so maybe this isn\u0027t the grand unification I was hoping for.","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6baf48ddaf178ea7d3ef0ecdd3ad1caf495cce8d","unresolved":true,"context_lines":[{"line_number":148,"context_line":"        app \u003d wsgi.loadapp(conf_path)"},{"line_number":149,"context_line":"        self.assertIsInstance(app, obj_server.ObjectController)"},{"line_number":150,"context_line":"        self.assertTrue(isinstance(app, obj_server.ObjectController))"},{"line_number":151,"context_line":"        self.assertEqual(1, app.client_timeout)"},{"line_number":152,"context_line":"        self.assertEqual(5, app.conn_timeout)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @with_tempdir"}],"source_content_type":"text/x-python","patch_set":2,"id":"bd243187_8ae9f1eb","line":151,"in_reply_to":"7204a4f3_400e1f98","updated":"2023-04-14 20:02:11.000000000","message":"N.B. there\u0027s no duplicate error here!  paste/wsgi config from *file* is happy to have both CLIENT_TIMEOUT/client_timeout - they are unique!","commit_id":"30acba0338c446bb7ed762d75ad6caef9fd2b055"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a5862130bc9b16e9ce4b30fca1d3f28530f6c1c8","unresolved":true,"context_lines":[{"line_number":306,"context_line":"            with open(path, \u0027wt\u0027) as fd:"},{"line_number":307,"context_line":"                fd.write(dedent(conf_body))"},{"line_number":308,"context_line":"        app_config \u003d lambda: wsgi.loadapp(tempdir)"},{"line_number":309,"context_line":"        self.assertDuplicateOption(app_config, \u0027client_timeout\u0027, 1.0)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    @with_tempdir"},{"line_number":312,"context_line":"    def test_load_app_config(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":4,"id":"f54df52a_789984d0","line":309,"updated":"2023-04-11 16:10:39.000000000","message":"*Still* py2 says no! Maybe something about dict ordering? Makes this py2 behavior *even worse* -- you **don\u0027t know** which value you\u0027ve got configured! I\u0027m less and less convinced that we should be codifying this behavior in tests; I think I\u0027d be fine with throwing a `@skipIf(six.PY2)` on the whole test.","commit_id":"d7d1c1532be4087a4acad113a967f4c3a3f39ded"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"794aca6c5c67ecdf1b10ae4bbc39a91c74760fe0","unresolved":true,"context_lines":[{"line_number":306,"context_line":"            with open(path, \u0027wt\u0027) as fd:"},{"line_number":307,"context_line":"                fd.write(dedent(conf_body))"},{"line_number":308,"context_line":"        app_config \u003d lambda: wsgi.loadapp(tempdir)"},{"line_number":309,"context_line":"        self.assertDuplicateOption(app_config, \u0027client_timeout\u0027, 1.0)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    @with_tempdir"},{"line_number":312,"context_line":"    def test_load_app_config(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":4,"id":"8b57dbd4_06a85161","line":309,"in_reply_to":"f54df52a_789984d0","updated":"2023-04-11 21:43:11.000000000","message":"heh, well, now that I have them seperate I think we could at least assert the value is mock.ANY 😊\n\nI think maybe I just got something confused when copy pasting from another test and didn\u0027t do as good a job as I wanted validating my changes?  It seems like if I change the value to 2.0 it passes reliably in a loop of 100 calls (although that might not be proving the behavior isn\u0027t undefined)","commit_id":"d7d1c1532be4087a4acad113a967f4c3a3f39ded"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2b215197dbd05db33cbdc96ec059748209dd0a66","unresolved":true,"context_lines":[{"line_number":306,"context_line":"            with open(path, \u0027wt\u0027) as fd:"},{"line_number":307,"context_line":"                fd.write(dedent(conf_body))"},{"line_number":308,"context_line":"        app_config \u003d lambda: wsgi.loadapp(tempdir)"},{"line_number":309,"context_line":"        self.assertDuplicateOption(app_config, \u0027client_timeout\u0027, 2.0)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    @with_tempdir"},{"line_number":312,"context_line":"    def test_load_app_config(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":5,"id":"e4a9ff4d_b2df681b","line":309,"updated":"2023-04-14 19:24:45.000000000","message":"this makes sense, wsgi config parsing *respects* case\n\npy3: this is duplicate error\npy2: CLIENT_TIMEOUT is not a duplicate, so it\u0027s ignored","commit_id":"74cc6e5d5bdc27a97a85e86ec4f5ca73e030bf29"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6baf48ddaf178ea7d3ef0ecdd3ad1caf495cce8d","unresolved":true,"context_lines":[{"line_number":306,"context_line":"            with open(path, \u0027wt\u0027) as fd:"},{"line_number":307,"context_line":"                fd.write(dedent(conf_body))"},{"line_number":308,"context_line":"        app_config \u003d lambda: wsgi.loadapp(tempdir)"},{"line_number":309,"context_line":"        self.assertDuplicateOption(app_config, \u0027client_timeout\u0027, 2.0)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    @with_tempdir"},{"line_number":312,"context_line":"    def test_load_app_config(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":5,"id":"dac90190_8e255bfd","line":309,"in_reply_to":"e4a9ff4d_b2df681b","updated":"2023-04-14 20:02:11.000000000","message":"nope, turns out wsgi conf.d parsing did NOT respect case\n\nthis comment is misleading, on py3 it was a duplicate because CLIENT_TIMEOUT \u003d\u003d client_timeout in conf.d\n\n... and I have no idea why un-patched readconf on py2 picks 2.0!?","commit_id":"74cc6e5d5bdc27a97a85e86ec4f5ca73e030bf29"}]}
