)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"706bc5c63a698f4dda76938203ee8e442c4b2c7f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a5409276_195847fe","updated":"2026-06-02 16:44:39.000000000","message":"-1 is for the incomplete types. We don\u0027t need to annotate all methods and functions, but we should annotate all parameter of the methods and functions we do annotate","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"6f8c037d543498d9b319a76813125149680d1e99","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"243167fd_2f24639c","updated":"2026-05-11 12:07:02.000000000","message":"Yes I can do some more. This is just what I keep locally when I’m working on the type drivers.","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"08eb6b9b46325d1a8a12ee9fc7bfdcf7e8fee834","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7ac6747c_14e8f031","updated":"2026-05-11 09:43:45.000000000","message":"looks ok, do you also plan to extend typing for other parts also?","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"}],"neutron_lib/plugins/ml2/api.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"706bc5c63a698f4dda76938203ee8e442c4b2c7f","unresolved":true,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# TODO(Python 3.11): replace total\u003dFalse with per-field NotRequired[]"},{"line_number":32,"context_line":"class SegmentDict(TypedDict, total\u003dFalse):"},{"line_number":33,"context_line":"    network_type: str"},{"line_number":34,"context_line":"    id: str"},{"line_number":35,"context_line":"    network_id: str"}],"source_content_type":"text/x-python","patch_set":1,"id":"fdbc603e_fc374044","line":32,"updated":"2026-06-02 16:44:39.000000000","message":"nit: any reason not to do this as `Segment`?\n\n```suggestion\nclass Segment(TypedDict, total\u003dFalse):\n```","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"7455f053151f5aa62c2653b294ed5726ef82dfe9","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# TODO(Python 3.11): replace total\u003dFalse with per-field NotRequired[]"},{"line_number":32,"context_line":"class SegmentDict(TypedDict, total\u003dFalse):"},{"line_number":33,"context_line":"    network_type: str"},{"line_number":34,"context_line":"    id: str"},{"line_number":35,"context_line":"    network_id: str"}],"source_content_type":"text/x-python","patch_set":1,"id":"c4d0e44a_91b28b02","line":32,"in_reply_to":"6828cf5c_02f186ca","updated":"2026-07-07 04:33:56.000000000","message":"Done","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"8980817c97b0092add65717e337d93dea5efe3a3","unresolved":true,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# TODO(Python 3.11): replace total\u003dFalse with per-field NotRequired[]"},{"line_number":32,"context_line":"class SegmentDict(TypedDict, total\u003dFalse):"},{"line_number":33,"context_line":"    network_type: str"},{"line_number":34,"context_line":"    id: str"},{"line_number":35,"context_line":"    network_id: str"}],"source_content_type":"text/x-python","patch_set":1,"id":"6828cf5c_02f186ca","line":32,"in_reply_to":"fdbc603e_fc374044","updated":"2026-06-02 23:22:49.000000000","message":"Cause there’s also access and usage of a Segment class which is not used or accessed like a dict while this one is. So this is to make it clear.","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"706bc5c63a698f4dda76938203ee8e442c4b2c7f","unresolved":true,"context_lines":[{"line_number":594,"context_line":"    - release_segment"},{"line_number":595,"context_line":"    \"\"\""},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    @abc.abstractmethod"},{"line_number":598,"context_line":"    def reserve_provider_segment("},{"line_number":599,"context_line":"            self, session, segment: SegmentDict,"},{"line_number":600,"context_line":"            filters: dict | None \u003d None) -\u003e SegmentDict:"},{"line_number":601,"context_line":"        \"\"\"Reserve resource associated with a provider network segment."},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":1,"id":"269f2d87_b8be6d7a","line":600,"range":{"start_line":597,"start_character":23,"end_line":600,"end_character":56},"updated":"2026-06-02 16:44:39.000000000","message":"You\u0027ve missed the `session` param and the parameters for the `dict` generic\n\n```suggestion\n    @abc.abstractmethod\n    def reserve_provider_segment(\n        self,\n        session: orm.session.Session,\n        segment: Segment,\n        filters: dict[str, object] | None \u003d None\n    ) -\u003e Segment:\n```\n\nYou\u0027ll need to add `from sqlalchemy import orm` above, obviously. You may want to simpify this to `from sqlalchemy.orm.session import Session` for typing purposes (`sqlalchemy` is one of the import exceptions in hacking) but that\u0027s up to you.","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"7455f053151f5aa62c2653b294ed5726ef82dfe9","unresolved":false,"context_lines":[{"line_number":594,"context_line":"    - release_segment"},{"line_number":595,"context_line":"    \"\"\""},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    @abc.abstractmethod"},{"line_number":598,"context_line":"    def reserve_provider_segment("},{"line_number":599,"context_line":"            self, session, segment: SegmentDict,"},{"line_number":600,"context_line":"            filters: dict | None \u003d None) -\u003e SegmentDict:"},{"line_number":601,"context_line":"        \"\"\"Reserve resource associated with a provider network segment."},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":1,"id":"fdb03597_95a12397","line":600,"range":{"start_line":597,"start_character":23,"end_line":600,"end_character":56},"in_reply_to":"269f2d87_b8be6d7a","updated":"2026-07-07 04:33:56.000000000","message":"Done","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"706bc5c63a698f4dda76938203ee8e442c4b2c7f","unresolved":true,"context_lines":[{"line_number":614,"context_line":"    @abc.abstractmethod"},{"line_number":615,"context_line":"    def allocate_tenant_segment("},{"line_number":616,"context_line":"            self, session,"},{"line_number":617,"context_line":"            filters: dict | None \u003d None) -\u003e SegmentDict:"},{"line_number":618,"context_line":"        \"\"\"Allocate resource for a new project network segment."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":1,"id":"e82f043a_81a4490b","line":617,"updated":"2026-06-02 16:44:39.000000000","message":"as above","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"7455f053151f5aa62c2653b294ed5726ef82dfe9","unresolved":false,"context_lines":[{"line_number":614,"context_line":"    @abc.abstractmethod"},{"line_number":615,"context_line":"    def allocate_tenant_segment("},{"line_number":616,"context_line":"            self, session,"},{"line_number":617,"context_line":"            filters: dict | None \u003d None) -\u003e SegmentDict:"},{"line_number":618,"context_line":"        \"\"\"Allocate resource for a new project network segment."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":1,"id":"03a77311_fdea7c09","line":617,"in_reply_to":"e82f043a_81a4490b","updated":"2026-07-07 04:33:56.000000000","message":"Done","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"706bc5c63a698f4dda76938203ee8e442c4b2c7f","unresolved":true,"context_lines":[{"line_number":633,"context_line":"    # remove the tenant version and make this an abtract method"},{"line_number":634,"context_line":"    def allocate_project_segment("},{"line_number":635,"context_line":"            self, session,"},{"line_number":636,"context_line":"            filters: dict | None \u003d None) -\u003e SegmentDict:"},{"line_number":637,"context_line":"        \"\"\"For backwards-compatibility, call allocate_tenant_segment()\"\"\""},{"line_number":638,"context_line":"        return self.allocate_tenant_segment(session, filters\u003dfilters)"},{"line_number":639,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"498c4fb3_c84f1cbd","line":636,"updated":"2026-06-02 16:44:39.000000000","message":"as above","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"7455f053151f5aa62c2653b294ed5726ef82dfe9","unresolved":false,"context_lines":[{"line_number":633,"context_line":"    # remove the tenant version and make this an abtract method"},{"line_number":634,"context_line":"    def allocate_project_segment("},{"line_number":635,"context_line":"            self, session,"},{"line_number":636,"context_line":"            filters: dict | None \u003d None) -\u003e SegmentDict:"},{"line_number":637,"context_line":"        \"\"\"For backwards-compatibility, call allocate_tenant_segment()\"\"\""},{"line_number":638,"context_line":"        return self.allocate_tenant_segment(session, filters\u003dfilters)"},{"line_number":639,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae638c5_9ead5696","line":636,"in_reply_to":"498c4fb3_c84f1cbd","updated":"2026-07-07 04:33:56.000000000","message":"Done","commit_id":"f025802592484a27cfff6746fc0c82faeaf89792"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"edf8e5483c5854396c993ab62094c00e3b55d847","unresolved":true,"context_lines":[{"line_number":30,"context_line":"NETWORK_ID \u003d \u0027network_id\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# TODO(Python 3.11): replace total\u003dFalse with per-field NotRequired[]"},{"line_number":34,"context_line":"class Segment(TypedDict, total\u003dFalse):"},{"line_number":35,"context_line":"    network_type: str"},{"line_number":36,"context_line":"    id: str"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f80bbcd_e9df58b9","line":33,"range":{"start_line":33,"start_character":7,"end_line":33,"end_character":18},"updated":"2026-07-07 20:13:14.000000000","message":"We only support py3.11+ should this be changed?","commit_id":"9c0728be803a11c18367624b75350b35c7bae23d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b97912bc202a38f8897a2bc9b811dd23e41cf98c","unresolved":true,"context_lines":[{"line_number":520,"context_line":"        return extensions"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    @property"},{"line_number":523,"context_line":"    def connectivity(self) -\u003e str:"},{"line_number":524,"context_line":"        \"\"\"Return the mechanism driver connectivity type"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        The possible values are \"l2\", \"l3\" and \"legacy\" (default)."}],"source_content_type":"text/x-python","patch_set":3,"id":"8d1a4e3a_107d9f62","line":523,"updated":"2026-08-04 10:16:24.000000000","message":"Would it make sense to drop this until we add hints for all methods/attributes of this class?","commit_id":"9c0728be803a11c18367624b75350b35c7bae23d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b97912bc202a38f8897a2bc9b811dd23e41cf98c","unresolved":true,"context_lines":[{"line_number":610,"context_line":"    \"\"\""},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"    @abc.abstractmethod"},{"line_number":613,"context_line":"    def reserve_provider_segment("},{"line_number":614,"context_line":"            self,"},{"line_number":615,"context_line":"            session: Session,"},{"line_number":616,"context_line":"            segment: Segment,"},{"line_number":617,"context_line":"            filters: dict[str, object] | None \u003d None) -\u003e Segment:"},{"line_number":618,"context_line":"        \"\"\"Reserve resource associated with a provider network segment."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":3,"id":"ae2c32fd_35001e14","line":617,"range":{"start_line":613,"start_character":0,"end_line":617,"end_character":65},"updated":"2026-08-04 10:16:24.000000000","message":"dicts are invariant, so if you pass a dict that contains str and int values, you won\u0027t be able to assign e.g. a bool value. Could/should we use `Mapping` from `collections.abc` here? Also, could we stick the return type on a separate line?\n\n```suggestion\n    def reserve_provider_segment(\n        self,\n        session: Session,\n        segment: Segment,\n        filters: Mapping[str, object] | None \u003d None,\n    ) -\u003e Segment:\n```\n\nditto for the two allocate methods below","commit_id":"9c0728be803a11c18367624b75350b35c7bae23d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b97912bc202a38f8897a2bc9b811dd23e41cf98c","unresolved":true,"context_lines":[{"line_number":657,"context_line":"        return self.allocate_tenant_segment(session, filters\u003dfilters)"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"    @abc.abstractmethod"},{"line_number":660,"context_line":"    def release_segment(self, session, segment):"},{"line_number":661,"context_line":"        \"\"\"Release network segment."},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":3,"id":"9b322692_8e244729","line":660,"updated":"2026-08-04 10:16:24.000000000","message":"Missed one?","commit_id":"9c0728be803a11c18367624b75350b35c7bae23d"}]}
