)]}'
{"id":"openstack%2Fhacking~967719","triplet_id":"openstack%2Fhacking~master~Ifc45876e3d3655bca66ca5eb6d585a03cd15ab8d","project":"openstack/hacking","branch":"master","topic":"typing","attention_set":{},"removed_from_attention_set":{"15334":{"account":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"last_update":"2026-05-08 16:13:30.000000000","reason":"\u003cGERRIT_ACCOUNT_15334\u003e replied on the change","reason_account":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"}},"8556":{"account":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"last_update":"2026-05-08 16:26:37.000000000","reason":"Change was submitted"}},"hashtags":[],"change_id":"Ifc45876e3d3655bca66ca5eb6d585a03cd15ab8d","subject":"Allow typing-related object imports","status":"MERGED","created":"2025-11-19 16:47:40.000000000","updated":"2026-05-08 16:27:30.000000000","submitted":"2026-05-08 16:26:37.000000000","submitter":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"total_comment_count":13,"unresolved_comment_count":0,"has_review_started":true,"submission_id":"967719-typing","meta_rev_id":"faa48de6a26337730a330de742cc04611b6e6f4c","_number":967719,"virtual_id_number":967719,"owner":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"actions":{},"labels":{"Verified":{"approved":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"all":[{"value":0,"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},{"value":0,"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},{"value":0,"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},{"tag":"autogenerated:zuul:gate","value":2,"date":"2026-05-08 16:26:37.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-2":"Fails","-1":"Doesn\u0027t seem to work"," 0":"No score","+1":"Works for me","+2":"Verified"},"description":"","default_value":0,"optional":true},"Code-Review":{"approved":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"all":[{"value":2,"date":"2026-03-09 13:03:28.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},{"value":2,"date":"2026-04-12 10:20:51.000000000","permitted_voting_range":{"min":2,"max":2},"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},{"value":0,"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},{"value":0,"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-2":"Do not merge","-1":"This patch needs further work before it can be merged"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me (core reviewer)"},"description":"","default_value":0,"optional":true},"Workflow":{"approved":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"all":[{"value":0,"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},{"value":0,"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},{"value":1,"date":"2026-05-08 16:13:30.000000000","permitted_voting_range":{"min":1,"max":1},"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},{"value":0,"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"}],"reviewers":{"REVIEWER":[{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"CC":[{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2025-11-19 16:59:01.000000000","updated_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"reviewer":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"state":"REVIEWER"},{"updated":"2025-11-19 19:46:40.000000000","updated_by":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"reviewer":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"state":"REVIEWER"},{"updated":"2026-03-10 14:58:26.000000000","updated_by":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"reviewer":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"state":"REVIEWER"},{"updated":"2026-04-08 12:53:14.000000000","updated_by":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"reviewer":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"state":"CC"},{"updated":"2026-04-12 10:20:51.000000000","updated_by":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"reviewer":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"state":"REVIEWER"}],"messages":[{"id":"2bcd0d676ab03b4b37440143df46de711cd5f46d","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"date":"2025-11-19 16:47:40.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"52604b1b014fc2a6cd88f8bcdf429b79c3136da5","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2025-11-19 16:59:01.000000000","message":"Patch Set 1: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/e673bf786fd5486e8197c968f0ecbeaa\n\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/6d2bd5c5b34e410a9837df79e8f8550f : SUCCESS in 6m 03s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/fe13d9262185497eb5092757ad0a3ecc : SUCCESS in 3m 43s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/1ea57675fce14c399f061e84fc246fae : SUCCESS in 1m 55s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/a55c9627848a4559998c18b3221df0b7 : SUCCESS in 3m 21s\n- openstack-tox-py312 https://zuul.opendev.org/t/openstack/build/0e44167903aa43ab83c5d4318dfa6d2e : SUCCESS in 2m 49s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/e2a13c0cd2004e4e8966ab4fab23852f : SUCCESS in 3m 52s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/ec4280bbf1fe46a199190c5c3c200558 : SUCCESS in 2m 29s\n- hacking-integration-nova https://zuul.opendev.org/t/openstack/build/54869a6a51264e078162679e164279f5 : FAILURE in 3m 11s (non-voting)","accounts_in_message":[],"_revision_number":1},{"id":"4f4618046f4af0563b27c7ae261aa2372a4501c1","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2025-11-19 19:46:40.000000000","message":"Patch Set 1: Code-Review-1\n\n(3 comments)","accounts_in_message":[],"_revision_number":1},{"id":"bd872e93229122a26a1664c6542d5c1532fc4480","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2025-11-20 19:22:19.000000000","message":"Patch Set 1: -Code-Review\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"93b5385ef8d256320a3af32bd29611c6265ea806","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-02-12 15:33:29.000000000","message":"Patch Set 1: Code-Review+2\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"a9ec2428f11176ed8ddb8d66420bd59084d1078a","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-02-12 15:33:47.000000000","message":"Patch Set 1:\n\n(3 comments)","accounts_in_message":[],"_revision_number":1},{"id":"a7e1145d6e242bb1b7886d1f444e6b5b00cf0f0f","author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"date":"2026-02-13 16:36:19.000000000","message":"Patch Set 1:\n\n(2 comments)","accounts_in_message":[],"_revision_number":1},{"id":"1b6394a18e7309bd69da04b2ff1671ffbe7f395d","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"date":"2026-03-09 13:03:28.000000000","message":"Uploaded patch set 2: Patch Set 1 was rebased.\n\nCopied Votes:\n* Code-Review+2 (copy condition: \"**changekind:TRIVIAL_REBASE** OR is:MIN\")\n\nOutdated Votes:\n* Verified+1\n","accounts_in_message":[],"_revision_number":2},{"id":"13c87f0348240057cbbb1fc569108bb5ed8a88f8","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-03-09 13:25:11.000000000","message":"Patch Set 2: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/b29318be3ac04875ab5a6a2dd71c689b\n\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/26fdf6a38e3243139ed3d661d9b42e21 : SUCCESS in 6m 19s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/b630edeb9eae4d33a5ed0879e75e31c1 : SUCCESS in 3m 52s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/87b14e868a5047fb91323b9eaee5550b : SUCCESS in 3m 10s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/8765c76268234e8c9625c6a6058b778d : SUCCESS in 3m 45s\n- openstack-tox-py312 https://zuul.opendev.org/t/openstack/build/cfb6326d49d4427c95dc5f6059d6cf1d : SUCCESS in 4m 21s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/3de32abd6d324882b9ed45b18ccf5aba : SUCCESS in 3m 26s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/323c6fd0e8404a38b28f5bb90ceec38a : SUCCESS in 6m 17s (non-voting)\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/511ab240e89d4fc3bb31d34a6702c42d : SUCCESS in 2m 50s\n- hacking-integration-nova https://zuul.opendev.org/t/openstack/build/8a957e2418804aa1b9acb0bbe3061fce : FAILURE in 5m 19s (non-voting)","accounts_in_message":[],"_revision_number":2},{"id":"19f54a476bd15e7b720498db516b0ef4933cf6a3","author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"date":"2026-04-08 12:46:54.000000000","message":"Patch Set 2:\n\n(1 comment)","accounts_in_message":[],"_revision_number":2},{"id":"158aacbbc125126f488e1aa02e6513896a9c17d0","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-04-08 12:58:33.000000000","message":"Patch Set 2:\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/cbf48570262246cbac788419cd1e0667\n\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/0b3d25d600e845f6b91f074677d7356c : SUCCESS in 6m 18s\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/219b058107bc44dcaed2f733c5caafa9 : SUCCESS in 3m 06s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/237941c78fa341b1b9889ae3c8928518 : SUCCESS in 2m 41s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/2708b877609e4d99bf53ed0433959456 : SUCCESS in 3m 21s\n- openstack-tox-py312 https://zuul.opendev.org/t/openstack/build/2c80677f892d408fb558dfe97ac6731f : SUCCESS in 3m 41s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/8aec8d6dd37348ed9faebf0b17dc7eb0 : SUCCESS in 3m 23s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/d00f0bf8d8e34313a5e910918a6bbda5 : SUCCESS in 5m 33s (non-voting)\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/b071b864b4274952850a6733659ec90d : SUCCESS in 3m 11s\n- hacking-integration-nova https://zuul.opendev.org/t/openstack/build/5e7400d33a1d4030af0d0309769bb983 : FAILURE in 5m 10s (non-voting)","accounts_in_message":[],"_revision_number":2},{"id":"de8300a5e80fd49e70fbe5155c7cd4a39732b35b","author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"date":"2026-04-08 13:12:18.000000000","message":"Patch Set 2:\n\n(1 comment)","accounts_in_message":[],"_revision_number":2},{"id":"9160754026a63edeb06cf653a1ab56703daf16dc","author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"date":"2026-04-12 10:20:51.000000000","message":"Patch Set 2: Code-Review+2","accounts_in_message":[],"_revision_number":2},{"id":"288547fec025e64f82807258afeb2910d11b8f9c","author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"date":"2026-05-08 16:13:30.000000000","message":"Patch Set 2: Workflow+1\n\n(1 comment)","accounts_in_message":[],"_revision_number":2},{"id":"1a9a04fb71ee5ff956f07b905f05c163cec12480","tag":"autogenerated:zuul:gate","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-05-08 16:14:26.000000000","message":"Patch Set 2: -Verified\n\nStarting gate jobs.","accounts_in_message":[],"_revision_number":2},{"id":"4759b0c207e3c1b2b5c71ccb3a327eca6120d830","tag":"autogenerated:zuul:gate","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-05-08 16:26:37.000000000","message":"Patch Set 2: Verified+2\n\nBuild succeeded (gate pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/d33853e550ae43208911d0d377258c5b\n\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/34eb418b372c48dc967f2f8a365bdc3b : SUCCESS in 6m 37s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/95cb5ffa957341ca8014a15a6fa1f26d : SUCCESS in 2m 31s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/7a7908ba9c494147ad43bf9a02d3d676 : SUCCESS in 2m 36s\n- openstack-tox-py312 https://zuul.opendev.org/t/openstack/build/d1f1eb02df884f169db134db46155202 : SUCCESS in 2m 07s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/f92c5531b73c495d8f589b8c4a804bb9 : SUCCESS in 3m 23s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/773e1d2c8ea84d66ad9bc6aa2cec70c6 : SUCCESS in 2m 43s","accounts_in_message":[],"_revision_number":2},{"id":"71d4e6650591e22cce180398382cf132f1e5c97b","tag":"autogenerated:gerrit:merged","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-05-08 16:26:37.000000000","message":"Change has been successfully merged","accounts_in_message":[],"_revision_number":2},{"id":"faa48de6a26337730a330de742cc04611b6e6f4c","tag":"autogenerated:zuul:promote","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-05-08 16:27:30.000000000","message":"Patch Set 2:\n\nBuild succeeded (promote pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/06deb8f77c4e4f4e9b1640d3b6a7e95a\n\n- promote-openstack-tox-docs https://zuul.opendev.org/t/openstack/build/e2b58e7bbb6644d4819512c989222e4d : SUCCESS in 39s\n- promote-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/57c244e1c37544bbb128d956f0a89d41 : SUCCESS in 40s","accounts_in_message":[],"_revision_number":2}],"current_revision_number":2,"current_revision":"4de6e790fb7e4ab374412b041ff440e91e4469c4","revisions":{"08a580008e00983591ddce5866ff4866e85854fe":{"kind":"REWORK","_number":1,"created":"2025-11-19 16:47:40.000000000","uploader":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"ref":"refs/changes/19/967719/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/hacking","ref":"refs/changes/19/967719/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/hacking refs/changes/19/967719/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/hacking refs/changes/19/967719/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/hacking refs/changes/19/967719/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/hacking refs/changes/19/967719/1"}}},"commit":{"parents":[{"commit":"822b93c4cc08c0918f3b6f22c43a32288f3869a9","subject":"Drop python 3.8 \u0026 3.9 support","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/hacking/commit/822b93c4cc08c0918f3b6f22c43a32288f3869a9"}]}],"author":{"name":"Stephen Finucane","email":"stephenfin@redhat.com","date":"2025-11-19 16:37:22.000000000","tz":0},"committer":{"name":"Stephen Finucane","email":"stephenfin@redhat.com","date":"2025-11-19 16:37:23.000000000","tz":0},"subject":"Allow typing-related object imports","message":"Allow typing-related object imports\n\nWhile our \"no object imports\" rule makes sense in most cases, it has\nproven impractical when it comes to typing. Attempts to enforce this\nhere have resulted is absurdly long and difficult to comprehend function\nsignatures, or have necessitated unintuitive import aliasing. For\nexample, contrast:\n\n    def process(\n        data: collections.abc.Sequence[\n            dict[str, collections.abc.Iterable[str]]\n        ] | None \u003d None,\n    ) -\u003e None: ...\n\nwith:\n\n    def process(data: Sequence[dict[str, Iterable[str]]]) -\u003e None:\n\nWe already gave exceptions for sqlalchemy, sqlalchemy-migrate, and i18n\npackages to prevent code like this:\n\n    query \u003d query.filter(\n        sql.or_(\n          models.Foo.deleted \u003d\u003d sql.false(), models.Bar.deleted.is_(None)\n        )\n    )\n    if not query.count():\n        msg \u003d i18n._(\"a really bad error\")\n        raise Exception(msg)\n\nrather than the more pleasing (and typical):\n\n    query \u003d query.filter(\n        or_(models.Foo.deleted \u003d\u003d sql.false(), models.Bar.deleted.is_(None))\n    )\n    if not query.count():\n        msg \u003d _(\"a really bad error\")\n        raise Exception(msg)\n\nSo this is merely a continuation.\n\nWhile here, we also remove sqlalchemy-migrate from the list of\nexceptions. No one is using this anymore since it doesn\u0027t support\nsqlalchemy 2.x and has gone end-of-life.\n\nChange-Id: Ifc45876e3d3655bca66ca5eb6d585a03cd15ab8d\nSigned-off-by: Stephen Finucane \u003cstephenfin@redhat.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/hacking/commit/08a580008e00983591ddce5866ff4866e85854fe"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/hacking/commit/08a580008e00983591ddce5866ff4866e85854fe"}]},"branch":"refs/heads/master"},"4de6e790fb7e4ab374412b041ff440e91e4469c4":{"kind":"TRIVIAL_REBASE","_number":2,"created":"2026-03-09 13:03:28.000000000","uploader":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"ref":"refs/changes/19/967719/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/hacking","ref":"refs/changes/19/967719/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/hacking refs/changes/19/967719/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/hacking refs/changes/19/967719/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/hacking refs/changes/19/967719/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/hacking refs/changes/19/967719/2"}}},"commit":{"parents":[{"commit":"d27907accd97d6ae5f2b41e5bd5fd7beda2c9ca8","subject":"Migrate setup configuration to pyproject.toml","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/hacking/commit/d27907accd97d6ae5f2b41e5bd5fd7beda2c9ca8"}]}],"author":{"name":"Stephen Finucane","email":"stephenfin@redhat.com","date":"2025-11-19 16:37:22.000000000","tz":0},"committer":{"name":"Stephen Finucane","email":"stephenfin@redhat.com","date":"2026-03-09 13:00:59.000000000","tz":0},"subject":"Allow typing-related object imports","message":"Allow typing-related object imports\n\nWhile our \"no object imports\" rule makes sense in most cases, it has\nproven impractical when it comes to typing. Attempts to enforce this\nhere have resulted is absurdly long and difficult to comprehend function\nsignatures, or have necessitated unintuitive import aliasing. For\nexample, contrast:\n\n    def process(\n        data: collections.abc.Sequence[\n            dict[str, collections.abc.Iterable[str]]\n        ] | None \u003d None,\n    ) -\u003e None: ...\n\nwith:\n\n    def process(data: Sequence[dict[str, Iterable[str]]]) -\u003e None:\n\nWe already gave exceptions for sqlalchemy, sqlalchemy-migrate, and i18n\npackages to prevent code like this:\n\n    query \u003d query.filter(\n        sql.or_(\n          models.Foo.deleted \u003d\u003d sql.false(), models.Bar.deleted.is_(None)\n        )\n    )\n    if not query.count():\n        msg \u003d i18n._(\"a really bad error\")\n        raise Exception(msg)\n\nrather than the more pleasing (and typical):\n\n    query \u003d query.filter(\n        or_(models.Foo.deleted \u003d\u003d sql.false(), models.Bar.deleted.is_(None))\n    )\n    if not query.count():\n        msg \u003d _(\"a really bad error\")\n        raise Exception(msg)\n\nSo this is merely a continuation.\n\nWhile here, we also remove sqlalchemy-migrate from the list of\nexceptions. No one is using this anymore since it doesn\u0027t support\nsqlalchemy 2.x and has gone end-of-life.\n\nChange-Id: Ifc45876e3d3655bca66ca5eb6d585a03cd15ab8d\nSigned-off-by: Stephen Finucane \u003cstephenfin@redhat.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/hacking/commit/4de6e790fb7e4ab374412b041ff440e91e4469c4"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/hacking/commit/4de6e790fb7e4ab374412b041ff440e91e4469c4"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[{"rule_name":"gerrit~DefaultSubmitRule","status":"CLOSED","labels":[{"label":"Verified","status":"MAY","applied_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}},{"label":"Code-Review","status":"MAY","applied_by":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"}},{"label":"Workflow","status":"MAY","applied_by":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"}}]}],"submit_requirements":[{"name":"Verified","description":"Verified in gate by CI","status":"SATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Verified\u003dMAX AND -label:Verified\u003dMIN","fulfilled":true,"status":"PASS","passing_atoms":["label:Verified\u003dMAX"],"failing_atoms":["label:Verified\u003dMIN"],"atom_explanations":{"label:Verified\u003dMAX":"","label:Verified\u003dMIN":""}}},{"name":"Code-Review","description":"Code reviewed by core reviewer","status":"SATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Code-Review\u003dMAX AND -label:Code-Review\u003dMIN","fulfilled":true,"status":"PASS","passing_atoms":["label:Code-Review\u003dMAX"],"failing_atoms":["label:Code-Review\u003dMIN"],"atom_explanations":{"label:Code-Review\u003dMAX":"","label:Code-Review\u003dMIN":""}}},{"name":"Workflow","description":"Approved for gate by core reviewer","status":"SATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Workflow\u003dMAX AND -label:Workflow\u003dMIN","fulfilled":true,"status":"PASS","passing_atoms":["label:Workflow\u003dMAX"],"failing_atoms":["label:Workflow\u003dMIN"],"atom_explanations":{"label:Workflow\u003dMAX":"","label:Workflow\u003dMIN":""}}}]}
