)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d81d45693d4f3eefe50c22a98729c3236416de3b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"6c7e336e_69928c72","updated":"2024-05-06 10:44:34.000000000","message":"A few things I would like to verify","commit_id":"00fefe4cccefdedb3f1d6c1621dde21a2ec4c3e7"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"6b74e7ae0ead1a6f3b9f71490c0d0b8364becbec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"7685cab9_69f58429","updated":"2024-05-21 13:34:51.000000000","message":"Looks good to me","commit_id":"c38c45841342e51d8b959cccc15043f2c28f7387"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"2a0f5d067de7717d8abed29b2aba6627e33e4689","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"e6ebf8cb_b773df19","updated":"2024-06-07 11:46:01.000000000","message":"Looks good to me","commit_id":"99f0ba3f15b7fe044113f4dca47119e01f450c90"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c9b54d90b188d77be5261844a9bc0754460fa1f4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"6dc1439c_6a8c89a1","updated":"2024-10-23 18:59:03.000000000","message":"I think the change to \"if None\" is wrong.","commit_id":"6e914a5b4c3464e378a7e71d18b38601afcde335"}],"octavia/certificates/manager/local.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"525944ee6654781b578089ce47dd227dbdd9eeee","unresolved":true,"context_lines":[{"line_number":88,"context_line":"                    pass_file.write(private_key_passphrase)"},{"line_number":89,"context_line":"        except OSError as ioe:"},{"line_number":90,"context_line":"            LOG.error(\"Failed to store certificate.\")"},{"line_number":91,"context_line":"            raise exceptions.CertificateStorageException(message\u003dioe.strerror)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return cert_ref"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"c621556d_db6b7d90","line":91,"range":{"start_line":91,"start_character":69,"end_line":91,"end_character":77},"updated":"2024-05-21 11:41:47.000000000","message":"+1","commit_id":"c38c45841342e51d8b959cccc15043f2c28f7387"}],"octavia/certificates/manager/noop.py":[{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d81d45693d4f3eefe50c22a98729c3236416de3b","unresolved":true,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        return local.LocalCert(**cert_data)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def get_cert(self, context, cert_ref, resource_ref\u003dNone, check_only\u003dFalse,"},{"line_number":87,"context_line":"                 service_name\u003dNone) -\u003e cert.Cert:"},{"line_number":88,"context_line":"        LOG.debug(\u0027Driver %s no-op, get_cert with cert_ref %s\u0027,"},{"line_number":89,"context_line":"                  self.__class__.__name__, cert_ref)"}],"source_content_type":"text/x-python","patch_set":9,"id":"2113bbc1_1aa15563","line":86,"range":{"start_line":86,"start_character":72,"end_line":86,"end_character":77},"updated":"2024-05-06 10:44:34.000000000","message":"Just to make sure, the default value here is False instead of True, is that something mypy requires?","commit_id":"00fefe4cccefdedb3f1d6c1621dde21a2ec4c3e7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"6ed6d0e65405c79b07bfee1c4478f791e82e791c","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        return local.LocalCert(**cert_data)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def get_cert(self, context, cert_ref, resource_ref\u003dNone, check_only\u003dFalse,"},{"line_number":87,"context_line":"                 service_name\u003dNone) -\u003e cert.Cert:"},{"line_number":88,"context_line":"        LOG.debug(\u0027Driver %s no-op, get_cert with cert_ref %s\u0027,"},{"line_number":89,"context_line":"                  self.__class__.__name__, cert_ref)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf6caa6f_c89ffd3c","line":86,"range":{"start_line":86,"start_character":72,"end_line":86,"end_character":77},"in_reply_to":"2113bbc1_1aa15563","updated":"2024-05-14 15:45:35.000000000","message":"This does seem wrong. Thanks for flagging it. I created that patch a year ago, so can\u0027t tell you why I changed this to False. Maybe it was an error during manual conflict resolution?! I am sure mypy doesn\u0027t care what the default value is as there is no type mismatch.","commit_id":"00fefe4cccefdedb3f1d6c1621dde21a2ec4c3e7"}],"octavia/cmd/agent.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"525944ee6654781b578089ce47dd227dbdd9eeee","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF \u003d cfg.CONF"},{"line_number":33,"context_line":"HM_SENDER_CMD_QUEUE: multiproc.queues.Queue \u003d multiproc.Queue()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class AmphoraAgent(gunicorn.app.base.BaseApplication):"}],"source_content_type":"text/x-python","patch_set":15,"id":"590dda88_b652b337","line":33,"range":{"start_line":33,"start_character":21,"end_line":33,"end_character":43},"updated":"2024-05-21 11:41:47.000000000","message":"interesting, is it an issue with the multiprocessing module?","commit_id":"c38c45841342e51d8b959cccc15043f2c28f7387"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"4418f1b7046812015426f7c9cb55d771780d5c6a","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF \u003d cfg.CONF"},{"line_number":33,"context_line":"HM_SENDER_CMD_QUEUE: multiproc.queues.Queue \u003d multiproc.Queue()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class AmphoraAgent(gunicorn.app.base.BaseApplication):"}],"source_content_type":"text/x-python","patch_set":15,"id":"118222a6_7345fdd8","line":33,"range":{"start_line":33,"start_character":21,"end_line":33,"end_character":43},"in_reply_to":"590dda88_b652b337","updated":"2024-05-21 12:27:23.000000000","message":"I found[1] as an explanation. It seems empty collections in particular (and an empty queue could be considered a collection I guess) require annotations in order for mypy to figure out the correct type.\n\nThe mypy error is:\n\n`octavia/cmd/agent.py:33:23: error: Need type annotation for \"HM_SENDER_CMD_QUEUE\"  [var-annotated]`\n\n[1]: https://mypy.readthedocs.io/en/stable/common_issues.html#types-of-empty-collections","commit_id":"c38c45841342e51d8b959cccc15043f2c28f7387"}],"octavia/cmd/prometheus_proxy.py":[{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d81d45693d4f3eefe50c22a98729c3236416de3b","unresolved":true,"context_lines":[{"line_number":290,"context_line":"    \"haproxy_backend_last_session_seconds \":"},{"line_number":291,"context_line":"        (\"octavia_pool_last_session_seconds \","},{"line_number":292,"context_line":"         \"# HELP octavia_pool_last_session_seconds Number of seconds since \""},{"line_number":293,"context_line":"         \"last session assigned to a member.\\n\", None, None),"},{"line_number":294,"context_line":"    \"haproxy_backend_last_session_seconds{\":"},{"line_number":295,"context_line":"        (\"octavia_pool_last_session_seconds{\", None, {\"proxy\u003d\": \"pool\u003d\"}),"},{"line_number":296,"context_line":"    \"haproxy_backend_current_queue \":"}],"source_content_type":"text/x-python","patch_set":9,"id":"d4239a33_812c9e9b","side":"PARENT","line":293,"range":{"start_line":293,"start_character":49,"end_line":293,"end_character":59},"updated":"2024-05-06 10:44:34.000000000","message":"I wonder why did you change this one (many other metrics have None, None)","commit_id":"b708d312f3af69451bd7619a897c3851c5a82a2d"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cf3f67679b730f3af9b35a4f7adcc42a15f13a3","unresolved":true,"context_lines":[{"line_number":290,"context_line":"    \"haproxy_backend_last_session_seconds \":"},{"line_number":291,"context_line":"        (\"octavia_pool_last_session_seconds \","},{"line_number":292,"context_line":"         \"# HELP octavia_pool_last_session_seconds Number of seconds since \""},{"line_number":293,"context_line":"         \"last session assigned to a member.\\n\", None, None),"},{"line_number":294,"context_line":"    \"haproxy_backend_last_session_seconds{\":"},{"line_number":295,"context_line":"        (\"octavia_pool_last_session_seconds{\", None, {\"proxy\u003d\": \"pool\u003d\"}),"},{"line_number":296,"context_line":"    \"haproxy_backend_current_queue \":"}],"source_content_type":"text/x-python","patch_set":9,"id":"8818e18e_5b6f1c41","side":"PARENT","line":293,"range":{"start_line":293,"start_character":49,"end_line":293,"end_character":59},"in_reply_to":"d4239a33_812c9e9b","updated":"2024-05-14 15:59:53.000000000","message":"Thank you. This comment proves the usefulness of mypy. 😄\n\nIf you look very hard you see that this value is actually (str, str, None, None). Correct would be a three value tuple: (str, str, None) in this case. That is something that is very easy to find with annotations and mypy, but very easy to miss during manual reviews. Not a big issue here though.","commit_id":"b708d312f3af69451bd7619a897c3851c5a82a2d"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d81d45693d4f3eefe50c22a98729c3236416de3b","unresolved":true,"context_lines":[{"line_number":48,"context_line":"#    tuple[2] substitutions happen prior to the key replacement in tuple[0]."},{"line_number":49,"context_line":"METRIC_MAP: tp.Dict[str,"},{"line_number":50,"context_line":"                    tp.Tuple[str, tp.Optional[str],"},{"line_number":51,"context_line":"                             tp.Optional[tp.Dict[tp.Any, tp.Any]]]] \u003d {"},{"line_number":52,"context_line":"    # Load balancer metrics"},{"line_number":53,"context_line":"    \"haproxy_process_pool_allocated_bytes \":"},{"line_number":54,"context_line":"        (\"octavia_memory_pool_allocated_bytes \","}],"source_content_type":"text/x-python","patch_set":9,"id":"c1f0104d_34f2db28","line":51,"range":{"start_line":51,"start_character":49,"end_line":51,"end_character":63},"updated":"2024-05-06 10:44:34.000000000","message":"I think we can make both str, so it will be optional dict of strs","commit_id":"00fefe4cccefdedb3f1d6c1621dde21a2ec4c3e7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"6ed6d0e65405c79b07bfee1c4478f791e82e791c","unresolved":false,"context_lines":[{"line_number":48,"context_line":"#    tuple[2] substitutions happen prior to the key replacement in tuple[0]."},{"line_number":49,"context_line":"METRIC_MAP: tp.Dict[str,"},{"line_number":50,"context_line":"                    tp.Tuple[str, tp.Optional[str],"},{"line_number":51,"context_line":"                             tp.Optional[tp.Dict[tp.Any, tp.Any]]]] \u003d {"},{"line_number":52,"context_line":"    # Load balancer metrics"},{"line_number":53,"context_line":"    \"haproxy_process_pool_allocated_bytes \":"},{"line_number":54,"context_line":"        (\"octavia_memory_pool_allocated_bytes \","}],"source_content_type":"text/x-python","patch_set":9,"id":"06d053af_993f8d04","line":51,"range":{"start_line":51,"start_character":49,"end_line":51,"end_character":63},"in_reply_to":"c1f0104d_34f2db28","updated":"2024-05-14 15:45:35.000000000","message":"Yes, it seems you\u0027re right.","commit_id":"00fefe4cccefdedb3f1d6c1621dde21a2ec4c3e7"}],"octavia/common/data_models.py":[{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d81d45693d4f3eefe50c22a98729c3236416de3b","unresolved":true,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BaseDataModel:"},{"line_number":30,"context_line":"    def _to_dict(self, value, calling_classes\u003dNone, recurse\u003dFalse):"},{"line_number":31,"context_line":"        ret: tp.Any"},{"line_number":32,"context_line":"        calling_classes \u003d calling_classes or []"},{"line_number":33,"context_line":"        # We need to have json convertible data for storing it in"},{"line_number":34,"context_line":"        # persistence jobboard backend."}],"source_content_type":"text/x-python","patch_set":9,"id":"1871f9b3_483ccc45","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":19},"updated":"2024-05-06 10:44:34.000000000","message":"nit: I don\u0027t know if declaring that a variable could be anything is really necessary, IMO","commit_id":"00fefe4cccefdedb3f1d6c1621dde21a2ec4c3e7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"6ed6d0e65405c79b07bfee1c4478f791e82e791c","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BaseDataModel:"},{"line_number":30,"context_line":"    def _to_dict(self, value, calling_classes\u003dNone, recurse\u003dFalse):"},{"line_number":31,"context_line":"        ret: tp.Any"},{"line_number":32,"context_line":"        calling_classes \u003d calling_classes or []"},{"line_number":33,"context_line":"        # We need to have json convertible data for storing it in"},{"line_number":34,"context_line":"        # persistence jobboard backend."}],"source_content_type":"text/x-python","patch_set":9,"id":"0c85146a_e3b317a5","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":19},"in_reply_to":"1871f9b3_483ccc45","updated":"2024-05-14 15:45:35.000000000","message":"The error mypy prints without this line is:\n\n```\noctavia/common/data_models.py: note: In member \"_to_dict\" of class \"BaseDataModel\":                                            \noctavia/common/data_models.py:41:23: error: Incompatible types in assignment                                                   \n(expression has type \"list[Never]\", variable has type \"str\")  [assignment]                                                     \n                    ret \u003d []                                   \n                          ^~                                   \noctavia/common/data_models.py:45:29: error: \"str\" has no attribute \"append\"                                                    \n[attr-defined]                                                 \n                                ret.append(                                                                                    \n                                ^~~~~~~~~~                                                                                     \noctavia/common/data_models.py:58:25: error: Item \"str\" of \"str | None\" has no                                                  \nattribute \"append\"  [union-attr]                               \n                            ret.append(                        \n                            ^~~~~~~~~~                         \noctavia/common/data_models.py:58:25: error: Item \"None\" of \"str | None\" has no                                                 \nattribute \"append\"  [union-attr]                               \n                            ret.append(                        \n                            ^~~~~~~~~~                         \noctavia/common/data_models.py:75:23: error: Incompatible types in assignment                                                   \n(expression has type \"list[Never]\", variable has type \"str | None\")  [assignment]                                              \n                    ret \u003d []\n```\n\nThe problem is that `ret` can be a string, list or None, so mypy flags that as a potential issue even though the code is essentially correct. One could argue that a function called `_to_dict` should actually return a dictionary, but that\u0027s another discussion.\n\nI changed this to `ret: tp.Union[str, list, None]` to be a little more precise.","commit_id":"00fefe4cccefdedb3f1d6c1621dde21a2ec4c3e7"}],"octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c9b54d90b188d77be5261844a9bc0754460fa1f4","unresolved":true,"context_lines":[{"line_number":206,"context_line":"            \u0027enable_prometheus\u0027: enable_prometheus,"},{"line_number":207,"context_line":"            \u0027require_insecure_fork\u0027: require_insecure_fork,"},{"line_number":208,"context_line":"        }"},{"line_number":209,"context_line":"        if amp_details is not None:"},{"line_number":210,"context_line":"            try:"},{"line_number":211,"context_line":"                # Enable cpu-pinning only if the amphora TuneD profile"},{"line_number":212,"context_line":"                # is active"}],"source_content_type":"text/x-python","patch_set":18,"id":"86ee7fc9_277e1c60","line":209,"updated":"2024-10-23 18:59:03.000000000","message":"This does not seem very pythonic[1]. The try block will handle the raised TypeError if this is None.\nThis change means you always get the \"if\" check performance hit, even when you know most of the time it will have information in it.\n\n[1] https://docs.python.org/3/glossary.html#term-EAFP","commit_id":"6e914a5b4c3464e378a7e71d18b38601afcde335"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"db8b5d84f4c2dc9f69941ce706cbe8cfe1545991","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            \u0027enable_prometheus\u0027: enable_prometheus,"},{"line_number":207,"context_line":"            \u0027require_insecure_fork\u0027: require_insecure_fork,"},{"line_number":208,"context_line":"        }"},{"line_number":209,"context_line":"        if amp_details is not None:"},{"line_number":210,"context_line":"            try:"},{"line_number":211,"context_line":"                # Enable cpu-pinning only if the amphora TuneD profile"},{"line_number":212,"context_line":"                # is active"}],"source_content_type":"text/x-python","patch_set":18,"id":"d005be34_04a633da","line":209,"in_reply_to":"86ee7fc9_277e1c60","updated":"2024-10-28 11:44:06.000000000","message":"Acknowledged","commit_id":"6e914a5b4c3464e378a7e71d18b38601afcde335"}],"octavia/db/repositories.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"525944ee6654781b578089ce47dd227dbdd9eeee","unresolved":true,"context_lines":[{"line_number":123,"context_line":"        :param filters: Filters to decide which entity should be retrieved."},{"line_number":124,"context_line":"        :raises AssertionError: If no data base object matching given"},{"line_number":125,"context_line":"            filters can be found."},{"line_number":126,"context_line":"        \"\"\""},{"line_number":127,"context_line":"        deleted \u003d filters.pop(\u0027show_deleted\u0027, True)"},{"line_number":128,"context_line":"        model \u003d session.query(self.model_class).filter_by(**filters)"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"40b6b59c_4253ccc6","line":126,"range":{"start_line":126,"start_character":8,"end_line":126,"end_character":11},"updated":"2024-05-21 11:41:47.000000000","message":"removed return type?\n\nhttps://f2603edc7c975e6924b6-f9c86595ee722ed5765b04c30efd2d71.ssl.cf2.rackcdn.com/905195/15/check/openstack-tox-docs/c1a93c8/docs/contributor/modules/octavia.db.html#octavia.db.repositories.BaseRepository.get","commit_id":"c38c45841342e51d8b959cccc15043f2c28f7387"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"4418f1b7046812015426f7c9cb55d771780d5c6a","unresolved":true,"context_lines":[{"line_number":123,"context_line":"        :param filters: Filters to decide which entity should be retrieved."},{"line_number":124,"context_line":"        :raises AssertionError: If no data base object matching given"},{"line_number":125,"context_line":"            filters can be found."},{"line_number":126,"context_line":"        \"\"\""},{"line_number":127,"context_line":"        deleted \u003d filters.pop(\u0027show_deleted\u0027, True)"},{"line_number":128,"context_line":"        model \u003d session.query(self.model_class).filter_by(**filters)"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"55772231_d9d2e18c","line":126,"range":{"start_line":126,"start_character":8,"end_line":126,"end_character":11},"in_reply_to":"40b6b59c_4253ccc6","updated":"2024-05-21 12:27:23.000000000","message":"Yeah. This method does not return `octavia.common.data_model`. That isn\u0027t even a type.\n\nAdding the correct type that works with checkers too is not straightforward, so I left this for a later patch. Gradual typing FTW.","commit_id":"c38c45841342e51d8b959cccc15043f2c28f7387"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"4784f1abd444d858ca44286d68a26abcb266cde9","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        :param filters: Filters to decide which entity should be retrieved."},{"line_number":124,"context_line":"        :raises AssertionError: If no data base object matching given"},{"line_number":125,"context_line":"            filters can be found."},{"line_number":126,"context_line":"        \"\"\""},{"line_number":127,"context_line":"        deleted \u003d filters.pop(\u0027show_deleted\u0027, True)"},{"line_number":128,"context_line":"        model \u003d session.query(self.model_class).filter_by(**filters)"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"970338a0_15706817","line":126,"range":{"start_line":126,"start_character":8,"end_line":126,"end_character":11},"in_reply_to":"55772231_d9d2e18c","updated":"2024-05-21 12:30:14.000000000","message":"Acknowledged","commit_id":"c38c45841342e51d8b959cccc15043f2c28f7387"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c9b54d90b188d77be5261844a9bc0754460fa1f4","unresolved":true,"context_lines":[{"line_number":246,"context_line":"        :param lb_dict: Dictionary representation of a load balancer"},{"line_number":247,"context_line":"        :param vip_dict: Dictionary representation of a vip"},{"line_number":248,"context_line":"        :param additional_vip_dicts: Dict representations of additional vips"},{"line_number":249,"context_line":"        :returns: octavia.common.data_models.LoadBalancer"},{"line_number":250,"context_line":"        \"\"\""},{"line_number":251,"context_line":"        additional_vip_dicts \u003d additional_vip_dicts or []"},{"line_number":252,"context_line":"        if not lb_dict.get(\u0027id\u0027):"}],"source_content_type":"text/x-python","patch_set":18,"id":"abe57ca3_4eddd366","side":"PARENT","line":249,"updated":"2024-10-23 18:59:03.000000000","message":"Interesting, this changes the docs as returns is no longer listed, but with the typing the return object is linked. Different, but probably better.","commit_id":"5b71942b2fdfdb5f372ac63a96c4b0f33da61276"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"db8b5d84f4c2dc9f69941ce706cbe8cfe1545991","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        :param lb_dict: Dictionary representation of a load balancer"},{"line_number":247,"context_line":"        :param vip_dict: Dictionary representation of a vip"},{"line_number":248,"context_line":"        :param additional_vip_dicts: Dict representations of additional vips"},{"line_number":249,"context_line":"        :returns: octavia.common.data_models.LoadBalancer"},{"line_number":250,"context_line":"        \"\"\""},{"line_number":251,"context_line":"        additional_vip_dicts \u003d additional_vip_dicts or []"},{"line_number":252,"context_line":"        if not lb_dict.get(\u0027id\u0027):"}],"source_content_type":"text/x-python","patch_set":18,"id":"1570aba9_71de229e","side":"PARENT","line":249,"in_reply_to":"abe57ca3_4eddd366","updated":"2024-10-28 11:44:06.000000000","message":"I agree. If the docstring used `rtype` instead of `returns` the result might have been similar.","commit_id":"5b71942b2fdfdb5f372ac63a96c4b0f33da61276"}],"octavia/network/drivers/noop_driver/driver.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"c9b54d90b188d77be5261844a9bc0754460fa1f4","unresolved":true,"context_lines":[{"line_number":445,"context_line":"        self.networkconfigconfig[(port_id, subnet_id)] \u003d ("},{"line_number":446,"context_line":"            port_id, subnet_id, \u0027unplug_fixed_ip\u0027)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        return _NOOP_MANAGER_VARS[\u0027ports\u0027].pop(port_id, None)  # type: ignore"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"class NoopNetworkDriver(driver_base.AbstractNetworkDriver):"}],"source_content_type":"text/x-python","patch_set":18,"id":"dae0d79a_7c4b3e7c","line":448,"updated":"2024-10-23 18:59:03.000000000","message":"nit: These ignores are getting a bit excessive","commit_id":"6e914a5b4c3464e378a7e71d18b38601afcde335"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"db8b5d84f4c2dc9f69941ce706cbe8cfe1545991","unresolved":true,"context_lines":[{"line_number":445,"context_line":"        self.networkconfigconfig[(port_id, subnet_id)] \u003d ("},{"line_number":446,"context_line":"            port_id, subnet_id, \u0027unplug_fixed_ip\u0027)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        return _NOOP_MANAGER_VARS[\u0027ports\u0027].pop(port_id, None)  # type: ignore"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"class NoopNetworkDriver(driver_base.AbstractNetworkDriver):"}],"source_content_type":"text/x-python","patch_set":18,"id":"4975d9b6_1d54ddd1","line":448,"in_reply_to":"dae0d79a_7c4b3e7c","updated":"2024-10-28 11:44:06.000000000","message":"Yes, I don\u0027t like that either. If you prefer, I could try to use the `typing.cast()` trick to remove some of the `# type: ignore` comments`.","commit_id":"6e914a5b4c3464e378a7e71d18b38601afcde335"}]}
