)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"85f484f4144f06575c761e3b6df749d8a153100e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"2402fa7a_a960fb63","updated":"2024-11-06 14:26:57.000000000","message":"the changes are mostly minimal since i last reviewd so +1 until ci reports back","commit_id":"fe9903d8105b81eca71b576f81e8deb9351e6436"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"84a5e1acdbe4cb83bb20f9b0df5dcd53634b5bf5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"2775014c_2229b4fd","updated":"2024-11-07 10:26:46.000000000","message":"mypy doesn\u0027t need to/shouldn\u0027t be included in `test-requirements.txt` any more since it\u0027s a linter.","commit_id":"0d0305d2bb9a28d17480143bf77dd7e80fbe470f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cc263cdd0da2294e2ad70b0733f486fe47eb58bc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"bfeb448c_3624866c","updated":"2024-11-07 15:59:19.000000000","message":"recheck That failure doesn\u0027t look related","commit_id":"0d0305d2bb9a28d17480143bf77dd7e80fbe470f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0011813a3aea1b6b27ef53da36c0f6f1f7c81009","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"11e2e40c_7994dd3b","updated":"2026-04-30 17:29:05.000000000","message":"ok there si nothing unresonable here so we can proceed with this and refien it with followups","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"afb004fd5771c4e43d98840e39ab10ad694e1652","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"06d04dd2_223a46f6","updated":"2026-05-01 12:47:49.000000000","message":"recheck failure on base patch","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"31b1aa94d831d72a2af2213a656b5cbab43996d2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"d04cd720_bcc21729","updated":"2026-04-30 13:26:42.000000000","message":"some nits but over all i think im ok with this.\nill loop back once i review the rest","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e98d531111e84dbe2584609610615cbac41b53d0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"0d6d5576_1d7557d4","updated":"2026-05-02 12:29:38.000000000","message":"recheck","commit_id":"960b217b57e3b6f29bd28c033a2074477e0ce0a8"}],"os_vif/__init__.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"81354280e1667174bb11b55405aecfcb9b96149a","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        LOG.info(\"Loaded VIF plugins: %s\", \", \".join(loaded_plugins))"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def plug("},{"line_number":55,"context_line":"    vif: \u0027os_vif.objects.VIFBase\u0027,"},{"line_number":56,"context_line":"    instance_info: \u0027os_vif.objects.InstanceInfo\u0027,"},{"line_number":57,"context_line":") -\u003e None:"},{"line_number":58,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_2f0d0635","line":55,"range":{"start_line":54,"start_character":9,"end_line":55,"end_character":34},"updated":"2020-08-20 23:50:47.000000000","message":"technically its any subclass of this but ya that works\nVIFBase shoudl never be instantiated directly.","commit_id":"6ea98ef4169bbb87194927e1167500c6b801bbfd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"81354280e1667174bb11b55405aecfcb9b96149a","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"def host_info("},{"line_number":127,"context_line":"    permitted_vif_type_names: ty.Optional[ty.List[str]] \u003d None,"},{"line_number":128,"context_line":") -\u003e \u0027os_vif.objects.HostInfo\u0027:"},{"line_number":129,"context_line":"    \"\"\""},{"line_number":130,"context_line":"    :param permitted_vif_type_names: list of VIF object names"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_ec167c55","line":128,"range":{"start_line":128,"start_character":4,"end_line":128,"end_character":31},"updated":"2020-08-20 23:50:47.000000000","message":"ah yes its an ovo so we are using the name in a sting to forwad declare it.","commit_id":"6ea98ef4169bbb87194927e1167500c6b801bbfd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f554915e634a291a91d26d4cf347850b02b2d4d8","unresolved":true,"context_lines":[{"line_number":159,"context_line":"        raise os_vif.exception.LibraryNotInitialized()"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    # We know obj is non-none since we invoked ExtensionManager with"},{"line_number":162,"context_line":"    # invoke_on_load"},{"line_number":163,"context_line":"    plugins \u003d ["},{"line_number":164,"context_line":"        _EXT_MANAGER[name].obj.describe()  # type: ignore[union-attr]"},{"line_number":165,"context_line":"        for name in sorted(_EXT_MANAGER.names())"}],"source_content_type":"text/x-python","patch_set":11,"id":"aa073aa6_87fb9287","line":162,"updated":"2026-04-25 08:27:38.000000000","message":"why not be consitent and use assert there as above.\nor remove the assert above adn add the #type ignore above instead","commit_id":"96d29cdd910e5e1b62b10a98e922e5ce8f68a84b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4b1625a05c287e0d0dfa7d6113e46323e0a61d36","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        raise os_vif.exception.LibraryNotInitialized()"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    # We know obj is non-none since we invoked ExtensionManager with"},{"line_number":162,"context_line":"    # invoke_on_load"},{"line_number":163,"context_line":"    plugins \u003d ["},{"line_number":164,"context_line":"        _EXT_MANAGER[name].obj.describe()  # type: ignore[union-attr]"},{"line_number":165,"context_line":"        for name in sorted(_EXT_MANAGER.names())"}],"source_content_type":"text/x-python","patch_set":11,"id":"cb11b777_a3674e1f","line":162,"in_reply_to":"aa073aa6_87fb9287","updated":"2026-04-27 11:14:13.000000000","message":"No reason beyond having come back to this change a few times and arrived at different solutions 😅 Done","commit_id":"96d29cdd910e5e1b62b10a98e922e5ce8f68a84b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0abd068438cb13c500e819599712b88b768583af","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        raise os_vif.exception.LibraryNotInitialized()"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    # We know obj is non-none since we invoked ExtensionManager with"},{"line_number":162,"context_line":"    # invoke_on_load"},{"line_number":163,"context_line":"    plugins \u003d ["},{"line_number":164,"context_line":"        _EXT_MANAGER[name].obj.describe()  # type: ignore[union-attr]"},{"line_number":165,"context_line":"        for name in sorted(_EXT_MANAGER.names())"}],"source_content_type":"text/x-python","patch_set":11,"id":"04057640_b6170506","line":162,"in_reply_to":"cb11b777_a3674e1f","updated":"2026-04-27 11:20:59.000000000","message":"Actually, there\u0027s no way to do this as it was written. I had to tweak things a little to use a for-loop instead of a list comprehension. Let me know if you want me to revert.","commit_id":"96d29cdd910e5e1b62b10a98e922e5ce8f68a84b"}],"os_vif/exception.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"81354280e1667174bb11b55405aecfcb9b96149a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    msg_fmt: str \u003d _(\"An unknown exception occurred.\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__("},{"line_number":29,"context_line":"        self, message: ty.Optional[str] \u003d None, **kwargs: ty.Any,"},{"line_number":30,"context_line":"    ) -\u003e None:"},{"line_number":31,"context_line":"        self.kwargs \u003d kwargs"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_cf272ab6","line":29,"range":{"start_line":29,"start_character":58,"end_line":29,"end_character":65},"updated":"2020-08-20 23:50:47.000000000","message":"i still think this can be ty.Dict i might play with that in a follow up patch. in fact im pretty sure i coudl ty.Dict[str, ty.Any]\n\nits not vaild to pass anything that is not a valid mapping or dict like object here.","commit_id":"6ea98ef4169bbb87194927e1167500c6b801bbfd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"31b1aa94d831d72a2af2213a656b5cbab43996d2","unresolved":true,"context_lines":[{"line_number":26,"context_line":"    msg_fmt: str \u003d _(\"An unknown exception occurred.\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__("},{"line_number":29,"context_line":"        self, message: str | None \u003d None, **kwargs: Any,"},{"line_number":30,"context_line":"    ) -\u003e None:"},{"line_number":31,"context_line":"        self.kwargs \u003d kwargs"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3e32ceb4_e2b61de5","line":29,"range":{"start_line":29,"start_character":52,"end_line":29,"end_character":55},"updated":"2026-04-30 13:26:42.000000000","message":"nit: `dict` or `dict|None` is probably better here.","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec92222e524cb09c602b622fbf94827e02de0fc4","unresolved":true,"context_lines":[{"line_number":26,"context_line":"    msg_fmt: str \u003d _(\"An unknown exception occurred.\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__("},{"line_number":29,"context_line":"        self, message: str | None \u003d None, **kwargs: Any,"},{"line_number":30,"context_line":"    ) -\u003e None:"},{"line_number":31,"context_line":"        self.kwargs \u003d kwargs"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5779f2eb_60b8c30b","line":29,"range":{"start_line":29,"start_character":52,"end_line":29,"end_character":55},"in_reply_to":"3e32ceb4_e2b61de5","updated":"2026-04-30 15:40:56.000000000","message":"When typing `*args` or `**kwargs`, you are indicating the type of the values of the tuple and dict, respectively. That is:\n\n```\ndef foo(*args: str, **kwargs: int):\n    reveal_type(args)\n    reveal_type(kwargs)\n```\n\nwill show the type of `args` as `tuple[str, ...]` and `kwargs` as `dict[str, int]`.\n\nWe also can\u0027t narrow the type of argument passed to this, fwict, so this is correct.","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d4c977ce1602fedfacbc3c8ea39738befb390f9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    msg_fmt: str \u003d _(\"An unknown exception occurred.\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__("},{"line_number":29,"context_line":"        self, message: str | None \u003d None, **kwargs: Any,"},{"line_number":30,"context_line":"    ) -\u003e None:"},{"line_number":31,"context_line":"        self.kwargs \u003d kwargs"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"f3b4a77a_34be4990","line":29,"range":{"start_line":29,"start_character":52,"end_line":29,"end_character":55},"in_reply_to":"5779f2eb_60b8c30b","updated":"2026-04-30 15:41:04.000000000","message":"Done","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"}],"os_vif/i18n.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"\"\"oslo.i18n integration module."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"See https://docs.openstack.org/oslo.i18n/latest/user/usage.html."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import typing as ty"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import oslo_i18n"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"DOMAIN \u003d \u0027os_vif\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"_translators \u003d oslo_i18n.TranslatorFactory(domain\u003dDOMAIN)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# The primary translation function using the well-known name \"_\""},{"line_number":30,"context_line":"_ \u003d _translators.primary"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def translate(value: str, user_locale: str) -\u003e str:"},{"line_number":34,"context_line":"    return oslo_i18n.translate(value, user_locale)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def get_available_languages() -\u003e ty.List[str]:"},{"line_number":38,"context_line":"    return oslo_i18n.get_available_languages(DOMAIN)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_e07bc1f1","line":38,"range":{"start_line":18,"start_character":3,"end_line":38,"end_character":52},"updated":"2020-08-07 11:24:48.000000000","message":"actull we do not translate os_vif so can you add a todo to delete this or better add a patch before this to remove it?","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d5780169dfd712405bfc513111aa42fc8dd21d01","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"\"\"oslo.i18n integration module."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"See https://docs.openstack.org/oslo.i18n/latest/user/usage.html."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import typing as ty"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import oslo_i18n"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"DOMAIN \u003d \u0027os_vif\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"_translators \u003d oslo_i18n.TranslatorFactory(domain\u003dDOMAIN)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# The primary translation function using the well-known name \"_\""},{"line_number":30,"context_line":"_ \u003d _translators.primary"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def translate(value: str, user_locale: str) -\u003e str:"},{"line_number":34,"context_line":"    return oslo_i18n.translate(value, user_locale)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def get_available_languages() -\u003e ty.List[str]:"},{"line_number":38,"context_line":"    return oslo_i18n.get_available_languages(DOMAIN)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_0c76d53e","line":38,"range":{"start_line":18,"start_character":3,"end_line":38,"end_character":52},"in_reply_to":"9f560f44_b124620e","updated":"2020-08-10 14:53:57.000000000","message":"im pretty sure that does not apply to libviarys and im not aware of any traslation that has ever been done for os-vif.\n\nif you can point me to any translation files ill happy to be corrected but i dont think we have ever supported it.\n\nwe do not have a locale folder with traslation like nova.\nhttps://github.com/openstack/nova/tree/master/nova/locale\n\nmany oslo project dont support this either \nhttps://github.com/openstack/oslo.messaging/tree/master/oslo_messaging\n\nno locale folder ^\n\nsome do like privsep\nhttps://github.com/openstack/oslo.privsep/tree/master/oslo_privsep/locale\n\n\nbut as far as i am aware lib are not required to support translation and we have no one signing up to do it.\n\nwell excpet form sean speak to english but we do that in code reviews:)\n\nwe can remove this in a different patch however. just wanted to point out this code is not used today.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"774ccd5ba75caa67f865827d17d446f720b22590","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"\"\"oslo.i18n integration module."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"See https://docs.openstack.org/oslo.i18n/latest/user/usage.html."},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import typing as ty"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import oslo_i18n"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"DOMAIN \u003d \u0027os_vif\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"_translators \u003d oslo_i18n.TranslatorFactory(domain\u003dDOMAIN)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# The primary translation function using the well-known name \"_\""},{"line_number":30,"context_line":"_ \u003d _translators.primary"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def translate(value: str, user_locale: str) -\u003e str:"},{"line_number":34,"context_line":"    return oslo_i18n.translate(value, user_locale)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def get_available_languages() -\u003e ty.List[str]:"},{"line_number":38,"context_line":"    return oslo_i18n.get_available_languages(DOMAIN)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_b124620e","line":38,"range":{"start_line":18,"start_character":3,"end_line":38,"end_character":52},"in_reply_to":"9f560f44_e07bc1f1","updated":"2020-08-10 14:33:01.000000000","message":"Let\u0027s discuss that separately. I\u0027m pretty sure we\u0027re obliged to translate exceptions, so while we can remove some of this I\u0027m not sure we can remove it all","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"}],"os_vif/internal/ip/api.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"8e2ef5ae14e723b963b2de92e9e2a693d08b5efa","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"if ty.TYPE_CHECKING:"},{"line_number":19,"context_line":"    from os_vif.internal.ip.linux.impl_pyroute2 import PyRoute2"},{"line_number":20,"context_line":"    from os_vif.internal.ip.windows.impl_netifaces import Netifaces"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_c00afdcf","line":19,"updated":"2020-08-07 10:34:57.000000000","message":"pep8: F401 \u0027os_vif.internal.ip.linux.impl_pyroute2.PyRoute2\u0027 imported but unused","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"8e2ef5ae14e723b963b2de92e9e2a693d08b5efa","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"if ty.TYPE_CHECKING:"},{"line_number":19,"context_line":"    from os_vif.internal.ip.linux.impl_pyroute2 import PyRoute2"},{"line_number":20,"context_line":"    from os_vif.internal.ip.windows.impl_netifaces import Netifaces"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_200e59e4","line":20,"updated":"2020-08-07 10:34:57.000000000","message":"pep8: F401 \u0027os_vif.internal.ip.windows.impl_netifaces.Netifaces\u0027 imported but unused","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a146b3dd910480f52b28487b08e7ac7285787e10","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"if ty.TYPE_CHECKING:"},{"line_number":19,"context_line":"    from os_vif.internal.ip.linux.impl_pyroute2 import PyRoute2"},{"line_number":20,"context_line":"    from os_vif.internal.ip.windows.impl_netifaces import Netifaces"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_0037d54e","line":20,"range":{"start_line":18,"start_character":0,"end_line":20,"end_character":67},"updated":"2020-08-07 11:01:25.000000000","message":"why do you need to do this","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"774ccd5ba75caa67f865827d17d446f720b22590","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"if ty.TYPE_CHECKING:"},{"line_number":19,"context_line":"    from os_vif.internal.ip.linux.impl_pyroute2 import PyRoute2"},{"line_number":20,"context_line":"    from os_vif.internal.ip.windows.impl_netifaces import Netifaces"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_b1d742bf","line":20,"range":{"start_line":18,"start_character":0,"end_line":20,"end_character":67},"in_reply_to":"9f560f44_0037d54e","updated":"2020-08-10 14:33:01.000000000","message":"I needed some way to get the return types for the below. Turns out they share a parent class so I can use that for the signature.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"809e41dc594a2074662c88fc508a68b25102d272","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"if ty.TYPE_CHECKING:"},{"line_number":19,"context_line":"    from os_vif.internal.ip.linux.impl_pyroute2 import PyRoute2"},{"line_number":20,"context_line":"    from os_vif.internal.ip.windows.impl_netifaces import Netifaces"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_ac008935","line":20,"range":{"start_line":18,"start_character":0,"end_line":20,"end_character":67},"in_reply_to":"9f560f44_b1d742bf","updated":"2020-08-10 15:01:51.000000000","message":"yes they share a parent class intetional which defiens the api.\n\nhttps://github.com/openstack/os-vif/blob/master/os_vif/internal/ip/ip_command.py","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"8e2ef5ae14e723b963b2de92e9e2a693d08b5efa","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def get_ip_lib_class() -\u003e ty.Union[\u0027PyRoute2\u0027, \u0027Netifaces\u0027]:"},{"line_number":27,"context_line":"    if os.name !\u003d \u0027nt\u0027:"},{"line_number":28,"context_line":"        from os_vif.internal.ip.linux.impl_pyroute2 import PyRoute2"},{"line_number":29,"context_line":"        return PyRoute2()"},{"line_number":30,"context_line":"    else:"},{"line_number":31,"context_line":"        from os_vif.internal.ip.windows.impl_netifaces import Netifaces"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_00119504","line":28,"updated":"2020-08-07 10:34:57.000000000","message":"pep8: F811 redefinition of unused \u0027PyRoute2\u0027 from line 19","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"8e2ef5ae14e723b963b2de92e9e2a693d08b5efa","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        from os_vif.internal.ip.linux.impl_pyroute2 import PyRoute2"},{"line_number":29,"context_line":"        return PyRoute2()"},{"line_number":30,"context_line":"    else:"},{"line_number":31,"context_line":"        from os_vif.internal.ip.windows.impl_netifaces import Netifaces"},{"line_number":32,"context_line":"        return Netifaces()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_60fb31c0","line":31,"updated":"2020-08-07 10:34:57.000000000","message":"pep8: F811 redefinition of unused \u0027Netifaces\u0027 from line 20","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"81354280e1667174bb11b55405aecfcb9b96149a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from oslo_log import log as logging"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from os_vif.internal.ip import ip_command"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_8c07001d","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":41},"updated":"2020-08-20 23:50:47.000000000","message":"by the way i have wanted to merge api.py and ip_command.py\ninto just api for a while but rodolfo say we cant an i never remeber why. i also have not tried lately but if we can make this one file that is what i want to do long term.\n\nbut for now this is fine.","commit_id":"6ea98ef4169bbb87194927e1167500c6b801bbfd"}],"os_vif/internal/ip/ip_command.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    @abc.abstractmethod"},{"line_number":24,"context_line":"    def set("},{"line_number":25,"context_line":"        self,"},{"line_number":26,"context_line":"        device: str,"},{"line_number":27,"context_line":"        check_exit_code: ty.Optional[ty.List[int]] \u003d None,"},{"line_number":28,"context_line":"        state: ty.Optional[str] \u003d None,"},{"line_number":29,"context_line":"        mtu: ty.Optional[int] \u003d None,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_c07e7de2","line":26,"range":{"start_line":25,"start_character":5,"end_line":26,"end_character":20},"updated":"2020-08-07 11:24:48.000000000","message":"these should be on the seam line","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b0a78834f9a3c0597921effdf370ae95c36d9af","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    @abc.abstractmethod"},{"line_number":24,"context_line":"    def set("},{"line_number":25,"context_line":"        self,"},{"line_number":26,"context_line":"        device: str,"},{"line_number":27,"context_line":"        check_exit_code: ty.Optional[ty.List[int]] \u003d None,"},{"line_number":28,"context_line":"        state: ty.Optional[str] \u003d None,"},{"line_number":29,"context_line":"        mtu: ty.Optional[int] \u003d None,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_fd9ab6c2","line":26,"range":{"start_line":25,"start_character":5,"end_line":26,"end_character":20},"in_reply_to":"9f560f44_0caa5517","updated":"2020-08-19 10:06:26.000000000","message":"\u003e if we want to do it consistently always use hanging indent if it\n \u003e does not fit on a single lin and pack with the retrun value and\n \u003e close ) on the same line as the last parameter.\n\nThe problem putting a return on the same line is that it means I need to indent all of the parameters to distinguish them from the body of the function. For example:\n\n  def hello_world(\n      param_a, param_b) -\u003e int:\n      if param_a:\n          do_something(param_b)\n  \n      ...\n\nisn\u0027t readable and has to be rewritten as:\n\n  def hello_world(\n          param_a, param_b) -\u003e int:\n      if param_a:\n          do_something(param_b)\n  \n      ...\n\nwhich wastes 5% of my available width, which is a lot when 5-15 is already gone with basic indentation. It also makes longer return types more challenging since I\u0027m now losing whatever width is used by the parameters on that line, not to mention being ugly af :)\n\nThis is easy, looks decent and we don\u0027t have to think about things. More importantly, gets basic type hints into the bulk of the code base.\n\nI\u0027ve nothing against moving to automated code formatting, but it\u0027s a very big hammer when simply holding your nose a little would accomplish the same thing. Remember, doing this work took me not insignificant time so I think it\u0027s only fair that I be a little opinionated in how it looks.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"774ccd5ba75caa67f865827d17d446f720b22590","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    @abc.abstractmethod"},{"line_number":24,"context_line":"    def set("},{"line_number":25,"context_line":"        self,"},{"line_number":26,"context_line":"        device: str,"},{"line_number":27,"context_line":"        check_exit_code: ty.Optional[ty.List[int]] \u003d None,"},{"line_number":28,"context_line":"        state: ty.Optional[str] \u003d None,"},{"line_number":29,"context_line":"        mtu: ty.Optional[int] \u003d None,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_d18ab6bc","line":26,"range":{"start_line":25,"start_character":5,"end_line":26,"end_character":20},"in_reply_to":"9f560f44_c07e7de2","updated":"2020-08-10 14:33:01.000000000","message":"I\u0027d really want to keep them on separate lines. I know it is occasionally wasteful space-wise, but it\u0027s the correct thing to do 80-90% of the time. Rather than trying to decide, let\u0027s just do this consistently. The only exception is where *all* arguments fit on one line. I\u0027m sure there are examples of that in here somewhere","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"809e41dc594a2074662c88fc508a68b25102d272","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    @abc.abstractmethod"},{"line_number":24,"context_line":"    def set("},{"line_number":25,"context_line":"        self,"},{"line_number":26,"context_line":"        device: str,"},{"line_number":27,"context_line":"        check_exit_code: ty.Optional[ty.List[int]] \u003d None,"},{"line_number":28,"context_line":"        state: ty.Optional[str] \u003d None,"},{"line_number":29,"context_line":"        mtu: ty.Optional[int] \u003d None,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_0caa5517","line":26,"range":{"start_line":25,"start_character":5,"end_line":26,"end_character":20},"in_reply_to":"9f560f44_d18ab6bc","updated":"2020-08-10 15:01:51.000000000","message":"and i would really want to never have argument on a new line unless they dont fit.\n\nif we want to do it consistently always use hanging indent if it does not fit on a single lin and pack with the retrun value and close ) on the same line as the last parameter.\n\nthe only way im ok with requiring the formatting you are proposing is if we move to automated code formatting. if we want to do that ill work on a set of formating rules with you that we can both live with and we will start using that.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @abc.abstractmethod"},{"line_number":48,"context_line":"    def add("},{"line_number":49,"context_line":"        self,"},{"line_number":50,"context_line":"        device: str,"},{"line_number":51,"context_line":"        dev_type: str,"},{"line_number":52,"context_line":"        check_exit_code: ty.Optional[ty.List[int]] \u003d None,"},{"line_number":53,"context_line":"        peer: ty.Optional[str] \u003d None,"},{"line_number":54,"context_line":"        link: ty.Optional[str] \u003d None,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_008515cf","line":51,"range":{"start_line":49,"start_character":4,"end_line":51,"end_character":22},"updated":"2020-08-07 11:24:48.000000000","message":"as should these","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @abc.abstractmethod"},{"line_number":74,"context_line":"    def delete("},{"line_number":75,"context_line":"        self,"},{"line_number":76,"context_line":"        device: str,"},{"line_number":77,"context_line":"        check_exit_code: ty.Optional[ty.List[int]] \u003d None,"},{"line_number":78,"context_line":"    ) -\u003e ty.Any:"},{"line_number":79,"context_line":"        \"\"\"Method to delete an interface."}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_606fb12a","line":76,"range":{"start_line":75,"start_character":7,"end_line":76,"end_character":20},"updated":"2020-08-07 11:24:48.000000000","message":"and these","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"81354280e1667174bb11b55405aecfcb9b96149a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def set("},{"line_number":25,"context_line":"        self,"},{"line_number":26,"context_line":"        device: str,"},{"line_number":27,"context_line":"        check_exit_code: ty.Optional[ty.List[int]] \u003d None,"},{"line_number":28,"context_line":"        state: ty.Optional[str] \u003d None,"},{"line_number":29,"context_line":"        mtu: ty.Optional[int] \u003d None,"},{"line_number":30,"context_line":"        address: ty.Optional[str] \u003d None,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_8fe6d243","line":27,"range":{"start_line":27,"start_character":25,"end_line":27,"end_character":57},"updated":"2020-08-20 23:50:47.000000000","message":"we proably could change this to\nty.list[int] \u003d []\n\nwe can do that in a follow up but this does not need to default to None","commit_id":"6ea98ef4169bbb87194927e1167500c6b801bbfd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"81354280e1667174bb11b55405aecfcb9b96149a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        address: ty.Optional[str] \u003d None,"},{"line_number":31,"context_line":"        promisc: ty.Optional[bool] \u003d None,"},{"line_number":32,"context_line":"        master: ty.Optional[str] \u003d None,"},{"line_number":33,"context_line":"    ) -\u003e ty.Any:"},{"line_number":34,"context_line":"        \"\"\"Method to set a parameter in an interface."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        :param   device: A network device (string)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_cf360ab5","line":33,"range":{"start_line":33,"start_character":9,"end_line":33,"end_character":15},"updated":"2020-08-20 23:50:47.000000000","message":"this feels wrong.\ni mean it will work but i think it returns a tuple\n\nhttps://github.com/svinota/pyroute2/blob/899054d3ea0b0c373b9fd64680c080737b30efb5/pyroute2/iproute/linux.py#L1355\n\nself.nlm_request and self._match also return tuples","commit_id":"6ea98ef4169bbb87194927e1167500c6b801bbfd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"31b1aa94d831d72a2af2213a656b5cbab43996d2","unresolved":true,"context_lines":[{"line_number":31,"context_line":"        address: str | None \u003d None,"},{"line_number":32,"context_line":"        promisc: bool | None \u003d None,"},{"line_number":33,"context_line":"        master: str | None \u003d None,"},{"line_number":34,"context_line":"    ) -\u003e Any:"},{"line_number":35,"context_line":"        \"\"\"Method to set a parameter in an interface."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        :param   device: A network device (string)"}],"source_content_type":"text/x-python","patch_set":12,"id":"f85a5473_4917c37d","line":34,"range":{"start_line":34,"start_character":9,"end_line":34,"end_character":12},"updated":"2026-04-30 13:26:42.000000000","message":"agin i think we can tighten this later but we can start with this","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec92222e524cb09c602b622fbf94827e02de0fc4","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        address: str | None \u003d None,"},{"line_number":32,"context_line":"        promisc: bool | None \u003d None,"},{"line_number":33,"context_line":"        master: str | None \u003d None,"},{"line_number":34,"context_line":"    ) -\u003e Any:"},{"line_number":35,"context_line":"        \"\"\"Method to set a parameter in an interface."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        :param   device: A network device (string)"}],"source_content_type":"text/x-python","patch_set":12,"id":"48cc5c47_6ae53ea1","line":34,"range":{"start_line":34,"start_character":9,"end_line":34,"end_character":12},"in_reply_to":"f85a5473_4917c37d","updated":"2026-04-30 15:40:56.000000000","message":"Yeah, I\u0027m planning to do this later on but it\u0027s non-trivial https://review.opendev.org/c/openstack/os-vif/+/976364/","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"}],"os_vif/internal/ip/linux/impl_pyroute2.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"class PyRoute2(ip_command.IpCommand):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def _ip_link("},{"line_number":31,"context_line":"        self,"},{"line_number":32,"context_line":"        ip: iproute.IPRoute,"},{"line_number":33,"context_line":"        command: str,"},{"line_number":34,"context_line":"        check_exit_code: ty.List[int],"},{"line_number":35,"context_line":"        **kwargs: ty.Any,"},{"line_number":36,"context_line":"    ) -\u003e ty.Any:"},{"line_number":37,"context_line":"        try:"},{"line_number":38,"context_line":"            LOG.debug(\u0027pyroute2 command %(command)s, arguments %(args)s\u0027 %"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_205bf986","line":35,"range":{"start_line":31,"start_character":8,"end_line":35,"end_character":25},"updated":"2020-08-07 11:24:48.000000000","message":"again these should be wrapped\nsame for the rest in other files","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"81354280e1667174bb11b55405aecfcb9b96149a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        try:"},{"line_number":38,"context_line":"            LOG.debug(\u0027pyroute2 command %(command)s, arguments %(args)s\u0027 %"},{"line_number":39,"context_line":"                      {\u0027command\u0027: command, \u0027args\u0027: kwargs})"},{"line_number":40,"context_line":"            return ip.link(command, **kwargs)"},{"line_number":41,"context_line":"        except ipexc.NetlinkError as e:"},{"line_number":42,"context_line":"            with excutils.save_and_reraise_exception() as ctx:"},{"line_number":43,"context_line":"                if e.code in check_exit_code:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_ef114e06","line":40,"updated":"2020-08-20 23:50:47.000000000","message":"so this should return a tuple as i mentioned eairler\nso if we can make this function retrun a tuple we can make the other type check correctly.","commit_id":"6ea98ef4169bbb87194927e1167500c6b801bbfd"}],"os_vif/objects/__init__.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import typing as ty"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"if ty.TYPE_CHECKING:"},{"line_number":16,"context_line":"    # TODO(stephenfin): Drop when o.vo grows an extension to do this for us"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    from os_vif.objects.fixed_ip import FixedIP, FixedIPList  # noqa"},{"line_number":19,"context_line":"    from os_vif.objects.host_info import (  # noqa"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_e0f2a16f","line":16,"range":{"start_line":16,"start_character":3,"end_line":16,"end_character":75},"updated":"2020-08-07 11:24:48.000000000","message":"can you explain what this does.\n\nwhy woudl you need to import these like this.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"774ccd5ba75caa67f865827d17d446f720b22590","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import typing as ty"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"if ty.TYPE_CHECKING:"},{"line_number":16,"context_line":"    # TODO(stephenfin): Drop when o.vo grows an extension to do this for us"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    from os_vif.objects.fixed_ip import FixedIP, FixedIPList  # noqa"},{"line_number":19,"context_line":"    from os_vif.objects.host_info import (  # noqa"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_31369204","line":16,"range":{"start_line":16,"start_character":3,"end_line":16,"end_character":75},"in_reply_to":"9f560f44_e0f2a16f","updated":"2020-08-10 14:33:01.000000000","message":"The \u0027os_vif.objects\u0027 class doesn\u0027t have any of these attributes initially. They are registered when we call \u0027register_all\u0027, which imports classes and executes the \u0027VersionedObjectRegistry.register\u0027 decorator, which does the assignment. Since mypy doesn\u0027t execute code, it never sees that happening so it complains that os_vif.objects doesn\u0027t have certain attributes.\n\nAdded a comment explaining this.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"31b1aa94d831d72a2af2213a656b5cbab43996d2","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        VIFPortProfileK8sDPDK,"},{"line_number":51,"context_line":"    )"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    __all__ \u003d ["},{"line_number":54,"context_line":"        \u0027FixedIP\u0027,"},{"line_number":55,"context_line":"        \u0027FixedIPList\u0027,"},{"line_number":56,"context_line":"        \u0027HostPortProfileInfo\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"e113ac6d_cb1f7d77","line":53,"updated":"2026-04-30 13:26:42.000000000","message":"i personally prefer that we dont do this in gernal but we have dicussed why this work or is requried for objects","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec92222e524cb09c602b622fbf94827e02de0fc4","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        VIFPortProfileK8sDPDK,"},{"line_number":51,"context_line":"    )"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    __all__ \u003d ["},{"line_number":54,"context_line":"        \u0027FixedIP\u0027,"},{"line_number":55,"context_line":"        \u0027FixedIPList\u0027,"},{"line_number":56,"context_line":"        \u0027HostPortProfileInfo\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"406261f3_f82e35b0","line":53,"in_reply_to":"e113ac6d_cb1f7d77","updated":"2026-04-30 15:40:56.000000000","message":"Acknowledged","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"}],"os_vif/objects/base.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __str__(self) -\u003e str:"},{"line_number":29,"context_line":"        if callable(getattr(self, \u0027obj_to_primitive\u0027, None)):"},{"line_number":30,"context_line":"            return str(self.obj_to_primitive())  # type: ignore"},{"line_number":31,"context_line":"        return super(VersionedObjectPrintableMixin, self).__str__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_60069154","line":30,"range":{"start_line":30,"start_character":49,"end_line":30,"end_character":63},"updated":"2020-08-07 11:24:48.000000000","message":"this will be a string so why do we have to ignore the type?","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"774ccd5ba75caa67f865827d17d446f720b22590","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __str__(self) -\u003e str:"},{"line_number":29,"context_line":"        if callable(getattr(self, \u0027obj_to_primitive\u0027, None)):"},{"line_number":30,"context_line":"            return str(self.obj_to_primitive())  # type: ignore"},{"line_number":31,"context_line":"        return super(VersionedObjectPrintableMixin, self).__str__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_ec15613e","line":30,"range":{"start_line":30,"start_character":49,"end_line":30,"end_character":63},"in_reply_to":"9f560f44_60069154","updated":"2020-08-10 14:33:01.000000000","message":"Because the parent of this class is \u0027object\u0027, and neither \u0027VersionedObjectPrintableMixin\u0027 nor \u0027object\u0027 have a \u0027obj_to_primitive\u0027 callable. I either have to ignore this, merge the mixin into its caller(s), or provide a stub definition for \u0027obj_to_primitive\u0027. I\u0027ve tried the latter approach in PS3","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d5780169dfd712405bfc513111aa42fc8dd21d01","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __str__(self) -\u003e str:"},{"line_number":29,"context_line":"        if callable(getattr(self, \u0027obj_to_primitive\u0027, None)):"},{"line_number":30,"context_line":"            return str(self.obj_to_primitive())  # type: ignore"},{"line_number":31,"context_line":"        return super(VersionedObjectPrintableMixin, self).__str__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_0cab7574","line":30,"range":{"start_line":30,"start_character":49,"end_line":30,"end_character":63},"in_reply_to":"9f560f44_ec15613e","updated":"2020-08-10 14:53:57.000000000","message":"oh its because its a mixin and this fucntion comes form the object we are mixed in  too got it.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"}],"os_vif/objects/fields.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    ALL \u003d (VEPA, PASSTHROUGH, BRIDGE)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self) -\u003e None:"},{"line_number":26,"context_line":"        super().__init__(valid_values\u003dVIFDirectMode.ALL)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class VIFDirectModeField(fields.BaseEnumField):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_c09afd11","line":26,"range":{"start_line":26,"start_character":7,"end_line":26,"end_character":15},"updated":"2020-08-07 11:24:48.000000000","message":"took a sec but yes im happy to start using the python3 only super syntax its much nicer","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"}],"os_vif/objects/host_info.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"81354280e1667174bb11b55405aecfcb9b96149a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from os_vif.objects import base as osv_base"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# TODO(stephenfin): Figure out types for exc_notmatch, exc_notsupported"},{"line_number":24,"context_line":"def _get_common_version("},{"line_number":25,"context_line":"    object_name: str,"},{"line_number":26,"context_line":"    max_version: str,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_ef2aee29","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":71},"updated":"2020-08-20 23:50:47.000000000","message":"we dont actully use this for anyting meaning full by the way.\nwe never started using os-vif between nova and neutron to negociate bindings and at this stage we proably never will :(\n\nso we proably can remove the host_info at some point\n\ni would like to use it for palcment to report the backend we supprot at some point but im not sure that will happen in the near term","commit_id":"6ea98ef4169bbb87194927e1167500c6b801bbfd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"31b1aa94d831d72a2af2213a656b5cbab43996d2","unresolved":true,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from __future__ import annotations"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from typing import Any"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5c8d348a_8005ac06","line":13,"updated":"2026-04-30 13:26:42.000000000","message":"ill just note that im not sure you need this currenly based on how you have been additn types\n\nyour not using the sting form and we can set the min version of pyton here to techinial 3.11 now but certenly 3.10 right so we may be able to drop this.","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec92222e524cb09c602b622fbf94827e02de0fc4","unresolved":true,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from __future__ import annotations"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from typing import Any"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"69ee0c38_3990d918","line":13,"in_reply_to":"5c8d348a_8005ac06","updated":"2026-04-30 15:40:56.000000000","message":"I can probably get away without it here, but I do need it other files to avoid attempting to load objects before they\u0027ve been registered. It\u0027s probably better to do this across all files, given this is otherwise a no-op for us since we\u0027re not doing stuff with types at runtime?","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"}],"os_vif/objects/instance_info.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    }"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    # TODO(stephenfin): Drop when o.vo grows an extension to do this for us"},{"line_number":36,"context_line":"    uuid: str"},{"line_number":37,"context_line":"    name: str"},{"line_number":38,"context_line":"    project_id: str"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_40af0d29","line":36,"range":{"start_line":36,"start_character":10,"end_line":36,"end_character":13},"updated":"2020-08-07 11:24:48.000000000","message":"could you use fields.UUIDField instead?\n\nit is a valid class so mypy should still allow it to be used even if it does not fully understand OVOs","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"774ccd5ba75caa67f865827d17d446f720b22590","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    }"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    # TODO(stephenfin): Drop when o.vo grows an extension to do this for us"},{"line_number":36,"context_line":"    uuid: str"},{"line_number":37,"context_line":"    name: str"},{"line_number":38,"context_line":"    project_id: str"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_0c3415dd","line":36,"range":{"start_line":36,"start_character":10,"end_line":36,"end_character":13},"in_reply_to":"9f560f44_40af0d29","updated":"2020-08-10 14:33:01.000000000","message":"Because we don\u0027t have access to type hints for o.vo, using fields.UUIDField is equivalent to using \u0027ty.Any\u0027. Even if o.vo was fully typed, I don\u0027t think UUIDField would help since it\u0027s still stored as a string","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"}],"os_vif/objects/network.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    vlan: ty.Optional[int]"},{"line_number":56,"context_line":"    mtu: ty.Optional[int]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __init__(self, **kwargs: ty.Any) -\u003e None:"},{"line_number":59,"context_line":"        kwargs.setdefault(\u0027subnets\u0027, objects.subnet.SubnetList(objects\u003d[]))"},{"line_number":60,"context_line":"        kwargs.setdefault(\u0027multi_host\u0027, False)"},{"line_number":61,"context_line":"        kwargs.setdefault(\u0027should_provide_bridge\u0027, False)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_c0683df6","line":58,"range":{"start_line":58,"start_character":36,"end_line":58,"end_character":39},"updated":"2020-08-07 11:24:48.000000000","message":"Dict","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d5780169dfd712405bfc513111aa42fc8dd21d01","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    vlan: ty.Optional[int]"},{"line_number":56,"context_line":"    mtu: ty.Optional[int]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __init__(self, **kwargs: ty.Any) -\u003e None:"},{"line_number":59,"context_line":"        kwargs.setdefault(\u0027subnets\u0027, objects.subnet.SubnetList(objects\u003d[]))"},{"line_number":60,"context_line":"        kwargs.setdefault(\u0027multi_host\u0027, False)"},{"line_number":61,"context_line":"        kwargs.setdefault(\u0027should_provide_bridge\u0027, False)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_0c2095f6","line":58,"range":{"start_line":58,"start_character":36,"end_line":58,"end_character":39},"in_reply_to":"9f560f44_0c49b55e","updated":"2020-08-10 14:53:57.000000000","message":"ty.Dict is the same as ty.Dict[Any,Any]\nits perfectly valid here.\n\nif you want to be even more generic you could use ty.Mapping\nbut this will be a dict.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"774ccd5ba75caa67f865827d17d446f720b22590","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    vlan: ty.Optional[int]"},{"line_number":56,"context_line":"    mtu: ty.Optional[int]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def __init__(self, **kwargs: ty.Any) -\u003e None:"},{"line_number":59,"context_line":"        kwargs.setdefault(\u0027subnets\u0027, objects.subnet.SubnetList(objects\u003d[]))"},{"line_number":60,"context_line":"        kwargs.setdefault(\u0027multi_host\u0027, False)"},{"line_number":61,"context_line":"        kwargs.setdefault(\u0027should_provide_bridge\u0027, False)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_0c49b55e","line":58,"range":{"start_line":58,"start_character":36,"end_line":58,"end_character":39},"in_reply_to":"9f560f44_c0683df6","updated":"2020-08-10 14:33:01.000000000","message":"Afraid not. Where you use the dict expansion syntax, the type information refers to the type of each key-value pair, which we can\u0027t enumerate here.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def obj_make_compatible("},{"line_number":67,"context_line":"        self,"},{"line_number":68,"context_line":"        primitive: ty.Dict[str, ty.Any],"},{"line_number":69,"context_line":"        target_version: str,"},{"line_number":70,"context_line":"    ) -\u003e None:"},{"line_number":71,"context_line":"        tuple_version \u003d versionutils.convert_version_to_tuple(target_version)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_e04e2195","line":68,"range":{"start_line":68,"start_character":18,"end_line":68,"end_character":39},"updated":"2020-08-07 11:24:48.000000000","message":"we use this type often i suspect\nit might be nice to create a list of common type alias\nin a module an reuse them that said i also see the value in just having the type direcly so im fine with keeping this as it is.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"}],"os_vif/objects/route.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(stephenfin): Drop when o.vo grows an extension to do this for us"},{"line_number":51,"context_line":"    objects: ty.List[Route]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_203ad9e5","line":51,"range":{"start_line":51,"start_character":13,"end_line":51,"end_character":27},"updated":"2020-08-07 11:24:48.000000000","message":"you are using an ovo in the type annotation here so you shoudl be able to use the filds ovos for cidr and gateway above right.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"774ccd5ba75caa67f865827d17d446f720b22590","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(stephenfin): Drop when o.vo grows an extension to do this for us"},{"line_number":51,"context_line":"    objects: ty.List[Route]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_6c7151a8","line":51,"range":{"start_line":51,"start_character":13,"end_line":51,"end_character":27},"in_reply_to":"9f560f44_203ad9e5","updated":"2020-08-10 14:33:01.000000000","message":"See previous replace. For what are essentially primitive types, I think it\u0027s better to use those same primitive types for annotations","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d5780169dfd712405bfc513111aa42fc8dd21d01","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # TODO(stephenfin): Drop when o.vo grows an extension to do this for us"},{"line_number":51,"context_line":"    objects: ty.List[Route]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_6c01516a","line":51,"range":{"start_line":51,"start_character":13,"end_line":51,"end_character":27},"in_reply_to":"9f560f44_6c7151a8","updated":"2020-08-10 14:53:57.000000000","message":"well if we were to follow that to its logical conlution we shoudl also not be more specific then just dict\n\ni think it makes more sense to sue the actul field object because that way if we get ovo support in the future we wont need to change them.\n\nif we just use str and rely on duck typing then we wont.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"}],"tox.ini":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cf145099e09ca4d639c57857c077a6a31e477b7d","unresolved":false,"context_lines":[{"line_number":21,"context_line":"[testenv:pep8]"},{"line_number":22,"context_line":"commands \u003d"},{"line_number":23,"context_line":"  flake8"},{"line_number":24,"context_line":"  {[testenv:mypy]commands}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"[testenv:mypy]"},{"line_number":27,"context_line":"commands\u003d"}],"source_content_type":"text/x-properties","patch_set":2,"id":"9f560f44_a006e91e","line":24,"range":{"start_line":24,"start_character":2,"end_line":24,"end_character":26},"updated":"2020-08-07 11:24:48.000000000","message":"no we should not add this to the pep8 env\nwe still have a todo to remove it form the pep8 job in nova and move it to the linters job.\n\ncan you add a linters env instead and then enable the linters job in the zuul.yaml instead.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"774ccd5ba75caa67f865827d17d446f720b22590","unresolved":false,"context_lines":[{"line_number":21,"context_line":"[testenv:pep8]"},{"line_number":22,"context_line":"commands \u003d"},{"line_number":23,"context_line":"  flake8"},{"line_number":24,"context_line":"  {[testenv:mypy]commands}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"[testenv:mypy]"},{"line_number":27,"context_line":"commands\u003d"}],"source_content_type":"text/x-properties","patch_set":2,"id":"9f560f44_ecb8c111","line":24,"range":{"start_line":24,"start_character":2,"end_line":24,"end_character":26},"in_reply_to":"9f560f44_a006e91e","updated":"2020-08-10 14:33:01.000000000","message":"While I\u0027d normally agree with you, I\u0027m afraid the battle for \u0027linters\u0027 rather than \u0027pep8\u0027 has been lost. The \u0027openstack-python3-victoria-jobs\u0027 template that everyone should be using includes the \u0027openstack-tox-pep8\u0027 job, which means we\u0027re always going to be running a \u0027pep8\u0027 job. If I add \u0027linters\u0027, we\u0027re going to be running \u0027flake8\u0027 twice, which is pretty wasteful. Alternatively, if I only add \u0027mypy\u0027 to \u0027linters\u0027 then \u0027linters\u0027 won\u0027t be running all linters. We just have to live with the bad naming, IMO","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d5780169dfd712405bfc513111aa42fc8dd21d01","unresolved":false,"context_lines":[{"line_number":21,"context_line":"[testenv:pep8]"},{"line_number":22,"context_line":"commands \u003d"},{"line_number":23,"context_line":"  flake8"},{"line_number":24,"context_line":"  {[testenv:mypy]commands}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"[testenv:mypy]"},{"line_number":27,"context_line":"commands\u003d"}],"source_content_type":"text/x-properties","patch_set":2,"id":"9f560f44_ac524965","line":24,"range":{"start_line":24,"start_character":2,"end_line":24,"end_character":26},"in_reply_to":"9f560f44_ecb8c111","updated":"2020-08-10 14:53:57.000000000","message":"im suggesting not including flake8 in linters\nand using linter for the other linters.","commit_id":"42a0dac9d4593cd4d526785584f2fe9f1cb1afa8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"31b1aa94d831d72a2af2213a656b5cbab43996d2","unresolved":true,"context_lines":[{"line_number":63,"context_line":"deps \u003d"},{"line_number":64,"context_line":"    pre-commit"},{"line_number":65,"context_line":"commands \u003d"},{"line_number":66,"context_line":"    pre-commit run --all-files --show-diff-on-failure"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"[flake8]"},{"line_number":69,"context_line":"# E123, E125 skipped as they are invalid PEP-8."}],"source_content_type":"text/x-properties","patch_set":12,"id":"777169db_f714439c","side":"PARENT","line":66,"range":{"start_line":66,"start_character":30,"end_line":66,"end_character":53},"updated":"2026-04-30 13:26:42.000000000","message":"nit: you do no tneed to remove this but we can.","commit_id":"473bb6fe6eeb9af6781629d327e5c0bbca732f90"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec92222e524cb09c602b622fbf94827e02de0fc4","unresolved":true,"context_lines":[{"line_number":63,"context_line":"deps \u003d"},{"line_number":64,"context_line":"    pre-commit"},{"line_number":65,"context_line":"commands \u003d"},{"line_number":66,"context_line":"    pre-commit run --all-files --show-diff-on-failure"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"[flake8]"},{"line_number":69,"context_line":"# E123, E125 skipped as they are invalid PEP-8."}],"source_content_type":"text/x-properties","patch_set":12,"id":"1ed8d5d8_082e2f0f","side":"PARENT","line":66,"range":{"start_line":66,"start_character":30,"end_line":66,"end_character":53},"in_reply_to":"777169db_f714439c","updated":"2026-04-30 15:40:56.000000000","message":"I\u0027m not sure how this got in. Copy-pasta I suspect. I can undo if we respin.","commit_id":"473bb6fe6eeb9af6781629d327e5c0bbca732f90"}],"vif_plug_ovs/ovs.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"31b1aa94d831d72a2af2213a656b5cbab43996d2","unresolved":true,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    NIC_NAME_LEN \u003d 14"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    CONFIG_OPTS \u003d ["},{"line_number":56,"context_line":"        cfg.IntOpt(\u0027network_device_mtu\u0027,"},{"line_number":57,"context_line":"                   default\u003d1500,"},{"line_number":58,"context_line":"                   help\u003d\u0027MTU setting for network interface.\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9575f8b9_cd39bc13","line":55,"range":{"start_line":55,"start_character":17,"end_line":55,"end_character":19},"updated":"2026-04-30 13:26:42.000000000","message":"so this is not intened to be dynmaic right so istin it mroe correct to use a touple\n\ni asssume we are passing thsi to a fuction that expect a list and this was changes as a result fi so that fine.","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec92222e524cb09c602b622fbf94827e02de0fc4","unresolved":true,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    NIC_NAME_LEN \u003d 14"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    CONFIG_OPTS \u003d ["},{"line_number":56,"context_line":"        cfg.IntOpt(\u0027network_device_mtu\u0027,"},{"line_number":57,"context_line":"                   default\u003d1500,"},{"line_number":58,"context_line":"                   help\u003d\u0027MTU setting for network interface.\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3bbf71de_6d31f394","line":55,"range":{"start_line":55,"start_character":17,"end_line":55,"end_character":19},"in_reply_to":"9575f8b9_cd39bc13","updated":"2026-04-30 15:40:56.000000000","message":"Yeah, I changed the type on `PluginBase` to list and typed `list_plugins_opts` as returning the same:\n\n* https://review.opendev.org/c/openstack/os-vif/+/745162/12/os_vif/plugin.py#32\n* https://review.opendev.org/c/openstack/os-vif/+/745162/12/os_vif/opts.py#44\n\nso this is aligning us with that. I could use tuple in each place if you prefer, but we usually use lists for this in the likes of Nova, e.g.\n\nhttps://github.com/openstack/nova/blob/9e73ede4f7c5ff8515e18b858c1153e69c09646f/nova/conf/cinder.py#L24","commit_id":"231c814d643f9fce37e7e8c3ecb1aa1122545752"}]}
