)]}'
{"id":"openstack%2Foslo.versionedobjects~992227","triplet_id":"openstack%2Foslo.versionedobjects~master~Idb5cd980ae9d7a2cd88c2a420b834112ee97edcf","project":"openstack/oslo.versionedobjects","branch":"master","topic":"typing","hashtags":[],"change_id":"Idb5cd980ae9d7a2cd88c2a420b834112ee97edcf","subject":"mypy: Drop field caching","status":"MERGED","created":"2026-06-08 12:38:53.000000000","updated":"2026-06-09 19:30:32.000000000","submitted":"2026-06-09 19:30:32.000000000","submitter":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"total_comment_count":0,"unresolved_comment_count":0,"has_review_started":true,"submission_id":"992227-typing","meta_rev_id":"32fb20c8baabf14f2f4c28c33403add12346a74e","_number":992227,"virtual_id_number":992227,"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":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},{"tag":"autogenerated:zuul:gate","value":2,"date":"2026-06-09 19:30:32.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":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"all":[{"value":2,"date":"2026-06-09 15:26:17.000000000","permitted_voting_range":{"min":2,"max":2},"_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":1,"date":"2026-06-09 15:26:17.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},"Backport-Candidate":{"all":[{"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 Backport","-1":"Not A Backport Candidate"," 0":"Backport Review Needed","+1":"Proposed Backport","+2":"Should Backport"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{"REVIEWER":[{"_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"]}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2026-06-08 14:00:39.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"}],"messages":[{"id":"2162e40fbdf3d5a8f91838ca86c82f1c99fd20f7","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"date":"2026-06-08 12:38:53.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"5e4907ec5d0c702141f5231e5226a59840b9e7c9","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-08 14:00:39.000000000","message":"Patch Set 1: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/67f329a04cc84dc2b96d2db6dbfcae43\n\n- tempest-full-py3 https://zuul.opendev.org/t/openstack/build/6f4e7f1f1f7a4fb587eada8f5c758f1d : SUCCESS in 1h 19m 42s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/38a8d6b020d04dc0ab3ab7c8f02799d2 : SUCCESS in 2m 53s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/1e3cb40329de4727ad5f4bf1fe91e6f8 : SUCCESS in 3m 41s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/d342109679c346908b68df98b187b746 : SUCCESS in 3m 33s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/5b4fcd8855104c6d9b3f58afbaa4a759 : SUCCESS in 3m 57s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/3eb85f8b5bc2418bb2a36113110394d7 : SUCCESS in 4m 45s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/844d5150e62d4dfb8925d46387d50f24 : SUCCESS in 5m 54s\n- oslo.versionedobjects-src-grenade-multinode https://zuul.opendev.org/t/openstack/build/9d926ff10e7f40c78eeeee4f230e7f83 : SUCCESS in 45m 56s (non-voting)\n- oslo.versionedobjects-nova-tox-py313 https://zuul.opendev.org/t/openstack/build/ea7db0307c364c35b2d08e9dcb10a648 : SUCCESS in 13m 44s\n- oslo.versionedobjects-ironic-tox-py313 https://zuul.opendev.org/t/openstack/build/a2790df449f848fc84c3224b6a694e20 : SUCCESS in 7m 01s","accounts_in_message":[],"_revision_number":1},{"id":"4e12d3d39e2c604bf084f7aeb4440069859c219a","author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"date":"2026-06-09 15:26:17.000000000","message":"Patch Set 1: Code-Review+2 Workflow+1","accounts_in_message":[],"_revision_number":1},{"id":"0a6798468aac12de80adcd14a50e4c8aa0e848e7","tag":"autogenerated:zuul:gate","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-09 17:17:54.000000000","message":"Patch Set 1: -Verified\n\nStarting gate jobs.","accounts_in_message":[],"_revision_number":1},{"id":"c676b039ab7c31e8c2a14c2044e218a6075b0ddd","tag":"autogenerated:zuul:gate","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-09 19:30:32.000000000","message":"Patch Set 1: Verified+2\n\nBuild succeeded (gate pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/15b36b2dd73a4ae798e43fb99e50fe6e\n\n- tempest-full-py3 https://zuul.opendev.org/t/openstack/build/50e9cfd9b38240f2af2caeec2e2ed3f0 : SUCCESS in 1h 48m 03s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/c15f9d4a90cd447abc5b222a5eeeb69f : SUCCESS in 4m 11s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/6e2b5376016846cb86349930fc7408c5 : SUCCESS in 3m 48s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/16a1cb940bca4e45b96db1b2b9e36c60 : SUCCESS in 3m 45s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/17e9fe4c51cb475aaaabd72e7d016378 : SUCCESS in 5m 41s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/5f58cff44e14417781524a7eca09be75 : SUCCESS in 6m 23s\n- oslo.versionedobjects-nova-tox-py313 https://zuul.opendev.org/t/openstack/build/be9c7b6e9a1a47ccb9983a467bef3a4a : SUCCESS in 17m 04s\n- oslo.versionedobjects-ironic-tox-py313 https://zuul.opendev.org/t/openstack/build/1668b25e005e40ec8cf29e3ff3772759 : SUCCESS in 8m 22s","accounts_in_message":[],"_revision_number":1},{"id":"32fb20c8baabf14f2f4c28c33403add12346a74e","tag":"autogenerated:gerrit:merged","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-09 19:30:32.000000000","message":"Change has been successfully merged","accounts_in_message":[],"_revision_number":1}],"current_revision_number":1,"current_revision":"0946fb91d079e9777aa35a49cba09171d1bf850f","revisions":{"0946fb91d079e9777aa35a49cba09171d1bf850f":{"kind":"REWORK","_number":1,"created":"2026-06-08 12:38:53.000000000","uploader":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"ref":"refs/changes/27/992227/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/oslo.versionedobjects","ref":"refs/changes/27/992227/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/oslo.versionedobjects refs/changes/27/992227/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/oslo.versionedobjects refs/changes/27/992227/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/oslo.versionedobjects refs/changes/27/992227/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/oslo.versionedobjects refs/changes/27/992227/1"}}},"commit":{"parents":[{"commit":"2e61d59687615b5dc473855fa45832021868af8d","subject":"mypy: Derive field types from generic parameter","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/oslo.versionedobjects/commit/2e61d59687615b5dc473855fa45832021868af8d"}]}],"author":{"name":"Stephen Finucane","email":"stephenfin@redhat.com","date":"2026-05-11 15:03:32.000000000","tz":60},"committer":{"name":"Stephen Finucane","email":"stephenfin@redhat.com","date":"2026-06-08 12:33:55.000000000","tz":60},"subject":"mypy: Drop field caching","message":"mypy: Drop field caching\n\nThe plugin registered a hook on builtins.object to cache each class\u0027s\nfields dict while its body was intact. The intent was to support MRO\ntraversal for mixin parent classes (e.g. TimestampedObject) whose class\nbodies were believed to be empty by the time subclasses were processed.\n\nThis cache was counterproductive. The hook fires before mypy\u0027s semantic\nanalysis runs, so the MemberExpr.fullname attributes on field callee\nnodes (e.g. fields.StringField) are still empty strings at cache time.\nThe guard checked fullname is None but missed the empty-string case, so\nevery cached field fell through to Any.\n\nRemove the cache entirely. Mypy processes classes in dependency order,\nso parent class bodies have fully-resolved AST nodes by the time any\nsubclass is analyzed. The plugin can walk ctx.cls.info.mro and read\neach parent\u0027s fields dict directly from its class body without caching.\n\nAlso tighten the callee fullname guard from `is None` to falsy so that\nempty strings from any unresolved AST nodes are caught consistently.\n\nChange-Id: Idb5cd980ae9d7a2cd88c2a420b834112ee97edcf\nSigned-off-by: Stephen Finucane \u003cstephenfin@redhat.com\u003e\nAssisted-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/oslo.versionedobjects/commit/0946fb91d079e9777aa35a49cba09171d1bf850f"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/oslo.versionedobjects/commit/0946fb91d079e9777aa35a49cba09171d1bf850f"}]},"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":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"}},{"label":"Workflow","status":"MAY","applied_by":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"}},{"label":"Backport-Candidate","status":"MAY"}]}],"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":"Backport-Candidate","description":"Backport candidate status","status":"NOT_APPLICABLE","is_legacy":false,"applicability_expression_result":{"fulfilled":false,"status":"FAIL"},"submittability_expression_result":{"expression":"is:true","fulfilled":true,"status":"NOT_EVALUATED","passing_atoms":[],"failing_atoms":[],"atom_explanations":{}}},{"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":""}}}]}
