)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"462f23751c5e8027f0eceefb2741e7a01fa6551e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     32caf7f3 (agent: separate driver loading from driver initialisation)"},{"line_number":2,"context_line":"Author:     jgilaber \u003cjgilaber@redhat.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2026-10-21 13:48:07 +0200"},{"line_number":4,"context_line":"Commit:     jgilaber \u003cjgilaber@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"0a2faf7d_c668a8c3","line":1,"updated":"2026-10-28 11:19:19.000000000","message":"The commit message reads \u0027Imports from the standard exception exempt, matching the accepted idioms;\u0027, which drops the verb (\u0027are\u0027) and uses the singular \u0027exception\u0027 where the plural is meant. The intended meaning remains inferable from context, but the sentence is garbled in the permanent change history that documents the new exception policy.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Impact**: A grammatically incomplete sentence in the permanent commit history slightly reduces the clarity of the documented import-exception policy for future readers of the change.\n\n**Recommendation**:\nReword the sentence to \u0027Imports from the standard exceptions are exempt, matching the accepted idioms;\u0027 in the commit message when producing the next patchset.","commit_id":"f05d6968f17623e75caf6eece906398e235d9ae5"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3b681a4bdf9ab7628b6a34dfeb2f7e83a17c7aca","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ea88ff2b_7ace6501","updated":"2026-10-27 19:12:30.000000000","message":"im conficltied between merging this even thoug it is incorrect to have a smller diffe to reveiw and respingin gthis to fix the defects","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"8aaab8868c171c30ce6a7c262ec0cbf7e917073d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"16fce1f6_3aa71e9d","in_reply_to":"ea88ff2b_7ace6501","updated":"2026-10-28 08:55:14.000000000","message":"I\u0027ve created a follow-up patch https://review.opendev.org/c/openstack/cyborg/+/1012665 to remove the http, io exceptions, reuse the hacking exception mechanism and flag constants in the check, mostly to avoid making this patch even bigger, we can decide whether to squash them or merge them separately","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3ade9d9a4e46f9e128e7608bffc068224343a7d8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d9d543fa_e478c717","updated":"2026-10-29 12:08:05.000000000","message":"lgtm!","commit_id":"f05d6968f17623e75caf6eece906398e235d9ae5"}],"cyborg/accelerator/drivers/fpga/inspur/driver.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d143d2d9e35e5428feb63f21f2726bd02a12356a","unresolved":true,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_log import log as logging"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from cyborg.accelerator.drivers.fpga import base as fpga_base"},{"line_number":23,"context_line":"from cyborg.accelerator.drivers.fpga.inspur import sysinfo"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"8b789d43_f054bf0d","line":22,"range":{"start_line":22,"start_character":49,"end_line":22,"end_character":61},"updated":"2026-10-21 18:08:27.000000000","message":"nit: you shoudl only use as if the name would conflct without it","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b7dbdc4b8f02db1594809527a2d8593a229c3527","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_log import log as logging"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from cyborg.accelerator.drivers.fpga import base as fpga_base"},{"line_number":23,"context_line":"from cyborg.accelerator.drivers.fpga.inspur import sysinfo"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"096da62d_7a0d9d9a","line":22,"range":{"start_line":22,"start_character":49,"end_line":22,"end_character":61},"in_reply_to":"8b789d43_f054bf0d","updated":"2026-10-23 11:14:00.000000000","message":"Done","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"}],"cyborg/db/sqlalchemy/alembic/env.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d143d2d9e35e5428feb63f21f2726bd02a12356a","unresolved":true,"context_lines":[{"line_number":18,"context_line":"try:"},{"line_number":19,"context_line":"    # NOTE(whaom): This is to register the DB2 alembic code which"},{"line_number":20,"context_line":"    # is an optional runtime dependency."},{"line_number":21,"context_line":"    from ibm_db_alembic import ibm_db  # noqa"},{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    pass"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"52358929_43c11980","line":21,"updated":"2026-10-21 18:08:27.000000000","message":"we may waht to consider deprecating this\n\nwe have no testign for this and we really only supprot mariadb/mysql and sqlite for testing.","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"8aaab8868c171c30ce6a7c262ec0cbf7e917073d","unresolved":true,"context_lines":[{"line_number":18,"context_line":"try:"},{"line_number":19,"context_line":"    # NOTE(whaom): This is to register the DB2 alembic code which"},{"line_number":20,"context_line":"    # is an optional runtime dependency."},{"line_number":21,"context_line":"    from ibm_db_alembic import ibm_db  # noqa"},{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    pass"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ddf8ad5c_0617146d","line":21,"in_reply_to":"37217b8d_7c31b774","updated":"2026-10-28 08:55:14.000000000","message":"I\u0027ve created a follow-up patch to do that https://review.opendev.org/c/openstack/cyborg/+/1012666","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3b681a4bdf9ab7628b6a34dfeb2f7e83a17c7aca","unresolved":true,"context_lines":[{"line_number":18,"context_line":"try:"},{"line_number":19,"context_line":"    # NOTE(whaom): This is to register the DB2 alembic code which"},{"line_number":20,"context_line":"    # is an optional runtime dependency."},{"line_number":21,"context_line":"    from ibm_db_alembic import ibm_db  # noqa"},{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    pass"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"37217b8d_7c31b774","line":21,"in_reply_to":"4dc5a987_9a10bdb5","updated":"2026-10-27 19:12:30.000000000","message":"oh ya lets remove this in a seperate patch then and add a release note for it.\n\nits here so that you can pass a db url that uses the db2 driver to run the db schema migrations since i belive that is not loaded automaticly.\n\nhttps://github.com/ibmdb/python-ibmdb might be its replacement but neutron dropped this last cycle\n\nhttps://review.opendev.org/c/openstack/neutron/+/982002\n\ni think we should just do the same","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b7dbdc4b8f02db1594809527a2d8593a229c3527","unresolved":true,"context_lines":[{"line_number":18,"context_line":"try:"},{"line_number":19,"context_line":"    # NOTE(whaom): This is to register the DB2 alembic code which"},{"line_number":20,"context_line":"    # is an optional runtime dependency."},{"line_number":21,"context_line":"    from ibm_db_alembic import ibm_db  # noqa"},{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    pass"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"4dc5a987_9a10bdb5","line":21,"in_reply_to":"52358929_43c11980","updated":"2026-10-23 11:14:00.000000000","message":"agreed, also this library has not had any release since 2018 https://pypi.org/project/ibm_db_alembic/#history. I\u0027m not entirely sure what is the purpose of this, from a quick search it seems it\u0027s meant to give alembic support for some kind of IBM database motor?","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2ccd4361fc0573038edfb2ff431e826f60e32ca","unresolved":false,"context_lines":[{"line_number":18,"context_line":"try:"},{"line_number":19,"context_line":"    # NOTE(whaom): This is to register the DB2 alembic code which"},{"line_number":20,"context_line":"    # is an optional runtime dependency."},{"line_number":21,"context_line":"    from ibm_db_alembic import ibm_db  # noqa"},{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    pass"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"368cde88_a5226cb8","line":21,"in_reply_to":"ddf8ad5c_0617146d","updated":"2026-10-30 14:19:45.000000000","message":"Acknowledged","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"}],"cyborg/hacking/checks.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d143d2d9e35e5428feb63f21f2726bd02a12356a","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        self.generic_visit(node)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class CheckDirectClassImport(ast.NodeVisitor):"},{"line_number":106,"context_line":"    \"\"\"C301: import modules, not classes."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Flags ``from x.y import SomeClass`` where ``SomeClass`` looks like a"}],"source_content_type":"text/x-python","patch_set":1,"id":"e5f9977c_eedb074a","line":105,"updated":"2026-10-21 18:08:27.000000000","message":"@stephenfin@redhat.com any reason not to put this in hackign proper?\neven if we intially dont enfoce it\n\ni know in the past we were a little concerned with doing the properly with\ninspect because its slow and we didnt really want to depend on the casing but its not terible.\n\nim mostly ok with have this as a local hook.\n\n@jgilaber@redhat.com there is a tox/hackifng config that you can use to exploed moduels form the import rules\n\nwe do not use it in cybrog but you can see an example in oslo.config\n\nhttps://github.com/openstack/oslo.config/blob/master/tox.ini#L76-L81\n\nwe shoudl be usign that to specify the \"EXEMPT_MODULES\" rather then hardcoding it.\n\nhttps://opendev.org/openstack/hacking/src/commit/5cf7c3ec9fdeb7e610cc1373c93a7783e2c323f3/hacking/core.py#L82-L90\n\nwe shoudl be using IMPORT_EXCEPTIONS form hacking really instead below.","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6daba78a206908a540efae488848605a47e7b7ed","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        self.generic_visit(node)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class CheckDirectClassImport(ast.NodeVisitor):"},{"line_number":106,"context_line":"    \"\"\"C301: import modules, not classes."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Flags ``from x.y import SomeClass`` where ``SomeClass`` looks like a"}],"source_content_type":"text/x-python","patch_set":1,"id":"bd3cf0df_5ef82b54","line":105,"in_reply_to":"3b044614_13a70c8c","updated":"2026-10-22 13:30:22.000000000","message":"in that case joan woudl you mind submiting a patch to hackign to add this rule there\n\nwe can merge teh rest of the clean here.\n\nmyself and stephn can review it for you on hackign as well, we will likely need to make this off by default not to break folks but we cna follow up here to enabled it for cybrog and likely watcher ectra.\n\nwe jus tned to properly use the IMPORT_EXCEPTIONS list and use the correct H hacking prefix","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6ed626e7cdf08e3ed3e4e0483c7d587af00b63f3","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        self.generic_visit(node)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class CheckDirectClassImport(ast.NodeVisitor):"},{"line_number":106,"context_line":"    \"\"\"C301: import modules, not classes."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Flags ``from x.y import SomeClass`` where ``SomeClass`` looks like a"}],"source_content_type":"text/x-python","patch_set":1,"id":"be2f1e75_70ca7fdc","line":105,"in_reply_to":"4dd8c9b1_b940fc9a","updated":"2026-10-22 14:42:41.000000000","message":"im ok with either. i expect we will be able to review and release hackign rather quickly for this so if you want the local check for now thats fine.\n\nwe should just start uing the real cofing options for this and such lcoally too.","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"911b451e45470491afdd46621e851acd33785747","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        self.generic_visit(node)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class CheckDirectClassImport(ast.NodeVisitor):"},{"line_number":106,"context_line":"    \"\"\"C301: import modules, not classes."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Flags ``from x.y import SomeClass`` where ``SomeClass`` looks like a"}],"source_content_type":"text/x-python","patch_set":1,"id":"4dd8c9b1_b940fc9a","line":105,"in_reply_to":"bd3cf0df_5ef82b54","updated":"2026-10-22 13:32:33.000000000","message":"sure, I\u0027ll do that later today. Do we want to keep the cyborg local check while the hacking one merges and is released?","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a9f62134a8b1b0a84d1ff513acbeb28a5f33b04a","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        self.generic_visit(node)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class CheckDirectClassImport(ast.NodeVisitor):"},{"line_number":106,"context_line":"    \"\"\"C301: import modules, not classes."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Flags ``from x.y import SomeClass`` where ``SomeClass`` looks like a"}],"source_content_type":"text/x-python","patch_set":1,"id":"c0ec8215_872f230f","line":105,"in_reply_to":"be2f1e75_70ca7fdc","updated":"2026-10-22 15:22:21.000000000","message":"I\u0027ve pushed the hacking patch https://review.opendev.org/c/openstack/hacking/+/1011889, I\u0027ll address the remainig changes here tomorrow","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"8aaab8868c171c30ce6a7c262ec0cbf7e917073d","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        self.generic_visit(node)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class CheckDirectClassImport(ast.NodeVisitor):"},{"line_number":106,"context_line":"    \"\"\"C301: import modules, not classes."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Flags ``from x.y import SomeClass`` where ``SomeClass`` looks like a"}],"source_content_type":"text/x-python","patch_set":1,"id":"73ae96cf_7528f3f5","line":105,"in_reply_to":"c0ec8215_872f230f","updated":"2026-10-28 08:55:14.000000000","message":"Done","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f3bf25ac52ec2cba4066e67d3a2d2a80d4e5868a","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        self.generic_visit(node)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class CheckDirectClassImport(ast.NodeVisitor):"},{"line_number":106,"context_line":"    \"\"\"C301: import modules, not classes."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Flags ``from x.y import SomeClass`` where ``SomeClass`` looks like a"}],"source_content_type":"text/x-python","patch_set":1,"id":"3b044614_13a70c8c","line":105,"in_reply_to":"e5f9977c_eedb074a","updated":"2026-10-22 12:01:58.000000000","message":"No, no issues with doing this in hacking that I\u0027m aware of at least. We just need to keep the import exceptions you\u0027ve noted and respect the config option.","commit_id":"ded930ce8b00e2f244b9ab6459f8ff553c29f42e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3b681a4bdf9ab7628b6a34dfeb2f7e83a17c7aca","unresolved":true,"context_lines":[{"line_number":110,"context_line":"    \"types\","},{"line_number":111,"context_line":"    \"typing\","},{"line_number":112,"context_line":"]"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def _load_import_exceptions(tox_file\u003d\"tox.ini\"):"},{"line_number":116,"context_line":"    \"\"\"Read ``[hacking] import_exceptions`` from tox.ini."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    Mirrors hacking\u0027s mechanism: the module names configured under the"},{"line_number":119,"context_line":"    ``[hacking]`` section are added to a small set of built-in defaults."},{"line_number":120,"context_line":"    Reading from ``[hacking]`` means the same configuration applies to"},{"line_number":121,"context_line":"    both the upstream hacking import checks and this one."},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":"    exceptions \u003d list(DEFAULT_IMPORT_EXCEPTIONS)"},{"line_number":124,"context_line":"    conf \u003d configparser.RawConfigParser()"},{"line_number":125,"context_line":"    conf.read(tox_file)"},{"line_number":126,"context_line":"    if conf.has_option(\"hacking\", \"import_exceptions\"):"},{"line_number":127,"context_line":"        raw \u003d conf.get(\"hacking\", \"import_exceptions\")"},{"line_number":128,"context_line":"        for line in raw.splitlines():"},{"line_number":129,"context_line":"            for item in line.split(\",\"):"},{"line_number":130,"context_line":"                item \u003d item.strip()"},{"line_number":131,"context_line":"                if item:"},{"line_number":132,"context_line":"                    exceptions.append(item)"},{"line_number":133,"context_line":"    return exceptions"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"IMPORT_EXCEPTIONS \u003d _load_import_exceptions()"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"def is_import_exception(mod):"},{"line_number":140,"context_line":"    \"\"\"Return True if the dotted import path is whitelisted."}],"source_content_type":"text/x-python","patch_set":2,"id":"4e97a2a7_70b56a6c","line":137,"range":{"start_line":113,"start_character":0,"end_line":137,"end_character":0},"updated":"2026-10-27 19:12:30.000000000","message":"i guess this is ok for now but i woudl heve prefered if you imported this logic form the hackign package since thse are hackign roels adn can depned on it as a runtime depency.\n\nhttps://github.com/openstack/cyborg/blob/master/.pre-commit-config.yaml#L38-L42","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"8aaab8868c171c30ce6a7c262ec0cbf7e917073d","unresolved":true,"context_lines":[{"line_number":110,"context_line":"    \"types\","},{"line_number":111,"context_line":"    \"typing\","},{"line_number":112,"context_line":"]"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def _load_import_exceptions(tox_file\u003d\"tox.ini\"):"},{"line_number":116,"context_line":"    \"\"\"Read ``[hacking] import_exceptions`` from tox.ini."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    Mirrors hacking\u0027s mechanism: the module names configured under the"},{"line_number":119,"context_line":"    ``[hacking]`` section are added to a small set of built-in defaults."},{"line_number":120,"context_line":"    Reading from ``[hacking]`` means the same configuration applies to"},{"line_number":121,"context_line":"    both the upstream hacking import checks and this one."},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":"    exceptions \u003d list(DEFAULT_IMPORT_EXCEPTIONS)"},{"line_number":124,"context_line":"    conf \u003d configparser.RawConfigParser()"},{"line_number":125,"context_line":"    conf.read(tox_file)"},{"line_number":126,"context_line":"    if conf.has_option(\"hacking\", \"import_exceptions\"):"},{"line_number":127,"context_line":"        raw \u003d conf.get(\"hacking\", \"import_exceptions\")"},{"line_number":128,"context_line":"        for line in raw.splitlines():"},{"line_number":129,"context_line":"            for item in line.split(\",\"):"},{"line_number":130,"context_line":"                item \u003d item.strip()"},{"line_number":131,"context_line":"                if item:"},{"line_number":132,"context_line":"                    exceptions.append(item)"},{"line_number":133,"context_line":"    return exceptions"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"IMPORT_EXCEPTIONS \u003d _load_import_exceptions()"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"def is_import_exception(mod):"},{"line_number":140,"context_line":"    \"\"\"Return True if the dotted import path is whitelisted."}],"source_content_type":"text/x-python","patch_set":2,"id":"4f5e8108_fab93d35","line":137,"range":{"start_line":113,"start_character":0,"end_line":137,"end_character":0},"in_reply_to":"4e97a2a7_70b56a6c","updated":"2026-10-28 08:55:14.000000000","message":"I\u0027ve done it in a follow-up patch","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2ccd4361fc0573038edfb2ff431e826f60e32ca","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    \"types\","},{"line_number":111,"context_line":"    \"typing\","},{"line_number":112,"context_line":"]"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def _load_import_exceptions(tox_file\u003d\"tox.ini\"):"},{"line_number":116,"context_line":"    \"\"\"Read ``[hacking] import_exceptions`` from tox.ini."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    Mirrors hacking\u0027s mechanism: the module names configured under the"},{"line_number":119,"context_line":"    ``[hacking]`` section are added to a small set of built-in defaults."},{"line_number":120,"context_line":"    Reading from ``[hacking]`` means the same configuration applies to"},{"line_number":121,"context_line":"    both the upstream hacking import checks and this one."},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":"    exceptions \u003d list(DEFAULT_IMPORT_EXCEPTIONS)"},{"line_number":124,"context_line":"    conf \u003d configparser.RawConfigParser()"},{"line_number":125,"context_line":"    conf.read(tox_file)"},{"line_number":126,"context_line":"    if conf.has_option(\"hacking\", \"import_exceptions\"):"},{"line_number":127,"context_line":"        raw \u003d conf.get(\"hacking\", \"import_exceptions\")"},{"line_number":128,"context_line":"        for line in raw.splitlines():"},{"line_number":129,"context_line":"            for item in line.split(\",\"):"},{"line_number":130,"context_line":"                item \u003d item.strip()"},{"line_number":131,"context_line":"                if item:"},{"line_number":132,"context_line":"                    exceptions.append(item)"},{"line_number":133,"context_line":"    return exceptions"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"IMPORT_EXCEPTIONS \u003d _load_import_exceptions()"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"def is_import_exception(mod):"},{"line_number":140,"context_line":"    \"\"\"Return True if the dotted import path is whitelisted."}],"source_content_type":"text/x-python","patch_set":2,"id":"5fe35e46_59a0c0a8","line":137,"range":{"start_line":113,"start_character":0,"end_line":137,"end_character":0},"in_reply_to":"4f5e8108_fab93d35","updated":"2026-10-30 14:19:45.000000000","message":"Acknowledged","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3b681a4bdf9ab7628b6a34dfeb2f7e83a17c7aca","unresolved":true,"context_lines":[{"line_number":157,"context_line":"    ambiguous bare class names scattered across a module."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    A name is treated as a class when it starts with an uppercase letter and"},{"line_number":160,"context_line":"    contains at least one lowercase letter.  All-caps names (constants) are"},{"line_number":161,"context_line":"    left alone to avoid false positives."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    Modules listed in ``[hacking] import_exceptions`` in ``tox.ini`` (plus"},{"line_number":164,"context_line":"    a few built-in defaults such as ``sqlalchemy`` and ``typing``) are"}],"source_content_type":"text/x-python","patch_set":2,"id":"0468993a_a29ea608","line":161,"range":{"start_line":160,"start_character":44,"end_line":161,"end_character":40},"updated":"2026-10-27 19:12:30.000000000","message":"i mentioned this on the hackign change but your not allowed to import contants either but i think we can adress that in a follow up patch\nwe will need to fix that in the hackign versions however.\n\nfor some historical context openstack hacking docuemtn was based orgiannly aon an old version of google python style guide \n\nhttps://google.github.io/styleguide/pyguide.html#22-imports\n\n```\n2.2 Imports\nUse import statements for packages and modules only, not for individual types, classes, or functions.\n\n\n\n2.2.1 Definition\nReusability mechanism for sharing code from one module to another.\n\n\n\n2.2.2 Pros\nThe namespace management convention is simple. The source of each identifier is indicated in a consistent way; x.Obj says that object Obj is defined in module x.\n\n\n\n2.2.3 Cons\nModule names can still collide. Some module names are inconveniently long.\n\n\n\n2.2.4 Decision\nUse import x for importing packages and modules.\nUse from x import y where x is the package prefix and y is the module name with no prefix.\nUse from x import y as z in any of the following circumstances:\nTwo modules named y are to be imported.\ny conflicts with a top-level name defined in the current module.\ny conflicts with a common parameter name that is part of the public API (e.g., features).\ny is an inconveniently long name.\ny is too generic in the context of your code (e.g., from storage.file_system import options as fs_options).\nUse import y as z only when z is a standard abbreviation (e.g., import numpy as np).\nFor example the module sound.effects.echo may be imported as follows:\n\nfrom sound.effects import echo\n...\necho.EchoFilter(input, output, delay\u003d0.7, atten\u003d4)\nDo not use relative names in imports. Even if the module is in the same package, use the full package name. This helps prevent unintentionally importing a package twice.\n\n\n2.2.4.1 Exemptions\nSymbols from the following modules, used to support static analysis and type checking, are exempt from this rule:\n\ntyping module\ncollections.abc module\ntyping_extensions module\n```\n\n```\nUse import statements for packages and modules only, not for individual types, classes, or functions.\n```\n\na constnatn is not a package or module","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"8aaab8868c171c30ce6a7c262ec0cbf7e917073d","unresolved":true,"context_lines":[{"line_number":157,"context_line":"    ambiguous bare class names scattered across a module."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    A name is treated as a class when it starts with an uppercase letter and"},{"line_number":160,"context_line":"    contains at least one lowercase letter.  All-caps names (constants) are"},{"line_number":161,"context_line":"    left alone to avoid false positives."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    Modules listed in ``[hacking] import_exceptions`` in ``tox.ini`` (plus"},{"line_number":164,"context_line":"    a few built-in defaults such as ``sqlalchemy`` and ``typing``) are"}],"source_content_type":"text/x-python","patch_set":2,"id":"5681d3e4_104a89fe","line":161,"range":{"start_line":160,"start_character":44,"end_line":161,"end_character":40},"in_reply_to":"0468993a_a29ea608","updated":"2026-10-28 08:55:14.000000000","message":"fixed in the follow-up patch as well","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2ccd4361fc0573038edfb2ff431e826f60e32ca","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    ambiguous bare class names scattered across a module."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    A name is treated as a class when it starts with an uppercase letter and"},{"line_number":160,"context_line":"    contains at least one lowercase letter.  All-caps names (constants) are"},{"line_number":161,"context_line":"    left alone to avoid false positives."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    Modules listed in ``[hacking] import_exceptions`` in ``tox.ini`` (plus"},{"line_number":164,"context_line":"    a few built-in defaults such as ``sqlalchemy`` and ``typing``) are"}],"source_content_type":"text/x-python","patch_set":2,"id":"c0334d53_a4623f91","line":161,"range":{"start_line":160,"start_character":44,"end_line":161,"end_character":40},"in_reply_to":"5681d3e4_104a89fe","updated":"2026-10-30 14:19:45.000000000","message":"Acknowledged","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"951e5f9ea4d9fa75c4277fbc4c05bcccbc757502","unresolved":true,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"# Built-in import exceptions, mirroring hacking\u0027s DEFAULT_IMPORT_EXCEPTIONS."},{"line_number":106,"context_line":"# These modules legitimately export names that are imported directly."},{"line_number":107,"context_line":"DEFAULT_IMPORT_EXCEPTIONS \u003d ["},{"line_number":108,"context_line":"    \"collections.abc\","},{"line_number":109,"context_line":"    \"sqlalchemy\","},{"line_number":110,"context_line":"    \"types\","},{"line_number":111,"context_line":"    \"typing\","},{"line_number":112,"context_line":"]"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def _load_import_exceptions(tox_file\u003d\"tox.ini\"):"},{"line_number":116,"context_line":"    \"\"\"Read ``[hacking] import_exceptions`` from tox.ini."}],"source_content_type":"text/x-python","patch_set":3,"id":"f519b794_1f6b6718","line":113,"range":{"start_line":107,"start_character":0,"end_line":113,"end_character":1},"updated":"2026-10-29 12:01:51.000000000","message":"Based on sean\u0027s comment here: https://review.opendev.org/c/openstack/cyborg/+/1011707/3/tox.ini\n\n`python3 -c \u0027from cyborg.hacking.checks import _load_import_exceptions; print(_load_import_exceptions())\u0027` should return only `[\u0027http\u0027, \u0027io\u0027, \u0027pathlib\u0027]` na?\n\nDue to DEFAULT_IMPORT_EXCEPTIONS variable, It is returning `[\u0027collections.abc\u0027, \u0027sqlalchemy\u0027, \u0027types\u0027, \u0027typing\u0027, \u0027http\u0027, \u0027io\u0027, \u0027pathlib\u0027]`\n\nCan we drop this var and set empty list and move theese exception in tox.ini?","commit_id":"f05d6968f17623e75caf6eece906398e235d9ae5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2ccd4361fc0573038edfb2ff431e826f60e32ca","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"# Built-in import exceptions, mirroring hacking\u0027s DEFAULT_IMPORT_EXCEPTIONS."},{"line_number":106,"context_line":"# These modules legitimately export names that are imported directly."},{"line_number":107,"context_line":"DEFAULT_IMPORT_EXCEPTIONS \u003d ["},{"line_number":108,"context_line":"    \"collections.abc\","},{"line_number":109,"context_line":"    \"sqlalchemy\","},{"line_number":110,"context_line":"    \"types\","},{"line_number":111,"context_line":"    \"typing\","},{"line_number":112,"context_line":"]"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def _load_import_exceptions(tox_file\u003d\"tox.ini\"):"},{"line_number":116,"context_line":"    \"\"\"Read ``[hacking] import_exceptions`` from tox.ini."}],"source_content_type":"text/x-python","patch_set":3,"id":"a1c2a013_493e723b","line":113,"range":{"start_line":107,"start_character":0,"end_line":113,"end_character":1},"in_reply_to":"bb29d148_672b115a","updated":"2026-10-30 14:19:45.000000000","message":"no i was explcity objecting to adding \n\u0027http\u0027, \u0027io\u0027, \u0027pathlib\u0027\n\ni dont env like allwoing the defautls of \"\u0027collections.abc\u0027, \u0027sqlalchemy\u0027, \u0027types\u0027, \u0027typing\u0027\" but its what is alowed by hackign by defualt and therefor what most projects allow unles they expclity overried it.\n\ni strongly dislike expection to the import rules but i can live with a minimal set i amnot oke with expenadign it to includ ehttp io and pathlib","commit_id":"f05d6968f17623e75caf6eece906398e235d9ae5"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3ade9d9a4e46f9e128e7608bffc068224343a7d8","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"# Built-in import exceptions, mirroring hacking\u0027s DEFAULT_IMPORT_EXCEPTIONS."},{"line_number":106,"context_line":"# These modules legitimately export names that are imported directly."},{"line_number":107,"context_line":"DEFAULT_IMPORT_EXCEPTIONS \u003d ["},{"line_number":108,"context_line":"    \"collections.abc\","},{"line_number":109,"context_line":"    \"sqlalchemy\","},{"line_number":110,"context_line":"    \"types\","},{"line_number":111,"context_line":"    \"typing\","},{"line_number":112,"context_line":"]"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def _load_import_exceptions(tox_file\u003d\"tox.ini\"):"},{"line_number":116,"context_line":"    \"\"\"Read ``[hacking] import_exceptions`` from tox.ini."}],"source_content_type":"text/x-python","patch_set":3,"id":"bb29d148_672b115a","line":113,"range":{"start_line":107,"start_character":0,"end_line":113,"end_character":1},"in_reply_to":"f519b794_1f6b6718","updated":"2026-10-29 12:08:05.000000000","message":"Ah, I see it is already being dropped here in next review: https://review.opendev.org/c/openstack/cyborg/+/1012665/2/cyborg/hacking/checks.py","commit_id":"f05d6968f17623e75caf6eece906398e235d9ae5"}],"cyborg/tests/unit/agent/test_manager.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d143d2d9e35e5428feb63f21f2726bd02a12356a","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    def _create_manager_with_mocks(self):"},{"line_number":38,"context_line":"        \"\"\"Create an AgentManager with all dependencies mocked.\"\"\""},{"line_number":39,"context_line":"        with ("},{"line_number":40,"context_line":"            mock.patch(\u0027cyborg.agent.manager.FPGADriver\u0027),"},{"line_number":41,"context_line":"            mock.patch(\u0027cyborg.agent.manager.cond_api.ConductorAPI\u0027),"},{"line_number":42,"context_line":"            mock.patch(\u0027cyborg.agent.manager.AgentAPI\u0027),"},{"line_number":43,"context_line":"            mock.patch(\u0027cyborg.agent.manager.ImageAPI\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"f2d3ebfd_de5430a0","side":"PARENT","line":40,"range":{"start_line":40,"start_character":23,"end_line":40,"end_character":56},"updated":"2026-10-21 18:08:27.000000000","message":"this was kind of incorrect before as it was pathching through an import so this was also a latent testing bug","commit_id":"38778160be29617f1f949c5941d1156f3f90e939"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2ccd4361fc0573038edfb2ff431e826f60e32ca","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def _create_manager_with_mocks(self):"},{"line_number":38,"context_line":"        \"\"\"Create an AgentManager with all dependencies mocked.\"\"\""},{"line_number":39,"context_line":"        with ("},{"line_number":40,"context_line":"            mock.patch(\u0027cyborg.agent.manager.FPGADriver\u0027),"},{"line_number":41,"context_line":"            mock.patch(\u0027cyborg.agent.manager.cond_api.ConductorAPI\u0027),"},{"line_number":42,"context_line":"            mock.patch(\u0027cyborg.agent.manager.AgentAPI\u0027),"},{"line_number":43,"context_line":"            mock.patch(\u0027cyborg.agent.manager.ImageAPI\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7e58dbee_da067c5e","side":"PARENT","line":40,"range":{"start_line":40,"start_character":23,"end_line":40,"end_character":56},"in_reply_to":"f2d3ebfd_de5430a0","updated":"2026-10-30 14:19:45.000000000","message":"Acknowledged","commit_id":"38778160be29617f1f949c5941d1156f3f90e939"}],"cyborg/tests/unit/test_hacking.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3b681a4bdf9ab7628b6a34dfeb2f7e83a17c7aca","unresolved":true,"context_lines":[{"line_number":228,"context_line":"        \"\"\""},{"line_number":229,"context_line":"        self._assert_has_no_errors(code, checker)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_constant_import_no_error(self):"},{"line_number":232,"context_line":"        checker \u003d checks.CheckDirectClassImport"},{"line_number":233,"context_line":"        code \u003d \"\"\""},{"line_number":234,"context_line":"            from cyborg.conf import CONF"},{"line_number":235,"context_line":"            from cyborg.common.constants import ARQ_STATES_TRANSFORM_MATRIX"},{"line_number":236,"context_line":"        \"\"\""},{"line_number":237,"context_line":"        self._assert_has_no_errors(code, checker)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def test_relative_import_no_error(self):"},{"line_number":240,"context_line":"        checker \u003d checks.CheckDirectClassImport"}],"source_content_type":"text/x-python","patch_set":2,"id":"49913c77_1fd7f978","line":237,"range":{"start_line":231,"start_character":3,"end_line":237,"end_character":49},"updated":"2026-10-27 19:12:30.000000000","message":"as noted elsewhere this shoudl be an error\n\nwe can fix this in a follow up as this is already quite large but this shoudl raise an error","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"8aaab8868c171c30ce6a7c262ec0cbf7e917073d","unresolved":true,"context_lines":[{"line_number":228,"context_line":"        \"\"\""},{"line_number":229,"context_line":"        self._assert_has_no_errors(code, checker)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_constant_import_no_error(self):"},{"line_number":232,"context_line":"        checker \u003d checks.CheckDirectClassImport"},{"line_number":233,"context_line":"        code \u003d \"\"\""},{"line_number":234,"context_line":"            from cyborg.conf import CONF"},{"line_number":235,"context_line":"            from cyborg.common.constants import ARQ_STATES_TRANSFORM_MATRIX"},{"line_number":236,"context_line":"        \"\"\""},{"line_number":237,"context_line":"        self._assert_has_no_errors(code, checker)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def test_relative_import_no_error(self):"},{"line_number":240,"context_line":"        checker \u003d checks.CheckDirectClassImport"}],"source_content_type":"text/x-python","patch_set":2,"id":"521d8ace_019db761","line":237,"range":{"start_line":231,"start_character":3,"end_line":237,"end_character":49},"in_reply_to":"49913c77_1fd7f978","updated":"2026-10-28 08:55:14.000000000","message":"fixed in the follow-up patch as well","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"}],"tox.ini":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3b681a4bdf9ab7628b6a34dfeb2f7e83a17c7aca","unresolved":true,"context_lines":[{"line_number":140,"context_line":"# Modules whose CamelCase members may be imported directly (consulted by"},{"line_number":141,"context_line":"# the C301 check and the upstream hacking import checks)."},{"line_number":142,"context_line":"import_exceptions \u003d"},{"line_number":143,"context_line":"    http"},{"line_number":144,"context_line":"    io"},{"line_number":145,"context_line":"    pathlib"}],"source_content_type":"text/x-properties","patch_set":2,"id":"7f2c5f39_dcca30b7","line":145,"range":{"start_line":143,"start_character":4,"end_line":145,"end_character":11},"updated":"2026-10-27 19:12:30.000000000","message":"no\n\n\u0027collections.abc\u0027,\n    \u0027sqlalchemy\u0027,\n    \u0027types\u0027,\n    \u0027typing\u0027\n    \nthats it we shoudl not be exemting these","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"8aaab8868c171c30ce6a7c262ec0cbf7e917073d","unresolved":true,"context_lines":[{"line_number":140,"context_line":"# Modules whose CamelCase members may be imported directly (consulted by"},{"line_number":141,"context_line":"# the C301 check and the upstream hacking import checks)."},{"line_number":142,"context_line":"import_exceptions \u003d"},{"line_number":143,"context_line":"    http"},{"line_number":144,"context_line":"    io"},{"line_number":145,"context_line":"    pathlib"}],"source_content_type":"text/x-properties","patch_set":2,"id":"d9d008a9_bd1c957b","line":145,"range":{"start_line":143,"start_character":4,"end_line":145,"end_character":11},"in_reply_to":"7f2c5f39_dcca30b7","updated":"2026-10-28 08:55:14.000000000","message":"fixed in the follow-up patch as well","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2ccd4361fc0573038edfb2ff431e826f60e32ca","unresolved":false,"context_lines":[{"line_number":140,"context_line":"# Modules whose CamelCase members may be imported directly (consulted by"},{"line_number":141,"context_line":"# the C301 check and the upstream hacking import checks)."},{"line_number":142,"context_line":"import_exceptions \u003d"},{"line_number":143,"context_line":"    http"},{"line_number":144,"context_line":"    io"},{"line_number":145,"context_line":"    pathlib"}],"source_content_type":"text/x-properties","patch_set":2,"id":"0b7e1c39_26c6c796","line":145,"range":{"start_line":143,"start_character":4,"end_line":145,"end_character":11},"in_reply_to":"d9d008a9_bd1c957b","updated":"2026-10-30 14:19:45.000000000","message":"Acknowledged","commit_id":"df6171787a7fb6b174c61669e73138b776cbbcee"}]}
