)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c6ec0ee088ab1df1bc7706a5927bcba2f6569e13","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ab9281e3_8b1d37bb","updated":"2024-12-09 15:10:32.000000000","message":"i think this makes sense but im not really following the details of this code chagne so i think i need to come back to this when i have time to dig into thise more.\n\ni dont curently have enough of the context loaded to review properly.","commit_id":"ae1fb9f6040803e9e2f28d6ec9b1e2578aad6a57"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b8f6b890d03a61dc2b68fcf7f3939a64d2e6e2a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"75007ed5_1d2fb348","updated":"2025-01-08 11:55:19.000000000","message":"recheck unrelated timeout","commit_id":"3b3797d50061ddda4878ba3d9c695786db09eb25"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"831b2f503342f31c1a9e078ec628011be89dec13","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"e417bfef_8f7443e7","updated":"2025-05-29 21:03:38.000000000","message":"lgtm,","commit_id":"89977c366174d942da6ffdcfd6f02080d7bacf2a"}],"nova/api/validation/__init__.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c6ec0ee088ab1df1bc7706a5927bcba2f6569e13","unresolved":true,"context_lines":[{"line_number":57,"context_line":"        max_version: ty.Optional[str],"},{"line_number":58,"context_line":"    ) -\u003e None:"},{"line_number":59,"context_line":"        # we\u0027d like to use bisect.insort but that doesn\u0027t accept a \u0027key\u0027 arg"},{"line_number":60,"context_line":"        # until Python 3.10, so we need to sort after insertion instead :("},{"line_number":61,"context_line":"        self._schemas.append("},{"line_number":62,"context_line":"            ("},{"line_number":63,"context_line":"                schema,"}],"source_content_type":"text/x-python","patch_set":2,"id":"46256ecf_a835c253","line":60,"updated":"2024-12-09 15:10:32.000000000","message":"you could do a ptyhon version check and fall back to this only in the 3.9 case if you like and use bisect.insort otherwise.\n\njust  pull out the logic into a private function and delegate to the approarte oen based on the python otherwise we cna just leave this as a comment and adress it in a future release.","commit_id":"ae1fb9f6040803e9e2f28d6ec9b1e2578aad6a57"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fbbf95bc3cb77090260eeb2d019bc5bf316b3e56","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        max_version: ty.Optional[str],"},{"line_number":58,"context_line":"    ) -\u003e None:"},{"line_number":59,"context_line":"        # we\u0027d like to use bisect.insort but that doesn\u0027t accept a \u0027key\u0027 arg"},{"line_number":60,"context_line":"        # until Python 3.10, so we need to sort after insertion instead :("},{"line_number":61,"context_line":"        self._schemas.append("},{"line_number":62,"context_line":"            ("},{"line_number":63,"context_line":"                schema,"}],"source_content_type":"text/x-python","patch_set":2,"id":"c0c8b3e1_881ffc05","line":60,"in_reply_to":"2282c8b5_c988aa3e","updated":"2025-01-28 12:22:04.000000000","message":"Done","commit_id":"ae1fb9f6040803e9e2f28d6ec9b1e2578aad6a57"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"be9cf0bcbb607df31917150f13eb295159f39405","unresolved":true,"context_lines":[{"line_number":57,"context_line":"        max_version: ty.Optional[str],"},{"line_number":58,"context_line":"    ) -\u003e None:"},{"line_number":59,"context_line":"        # we\u0027d like to use bisect.insort but that doesn\u0027t accept a \u0027key\u0027 arg"},{"line_number":60,"context_line":"        # until Python 3.10, so we need to sort after insertion instead :("},{"line_number":61,"context_line":"        self._schemas.append("},{"line_number":62,"context_line":"            ("},{"line_number":63,"context_line":"                schema,"}],"source_content_type":"text/x-python","patch_set":2,"id":"2282c8b5_c988aa3e","line":60,"in_reply_to":"46256ecf_a835c253","updated":"2024-12-09 15:36:20.000000000","message":"Eh, I could but it\u0027d make this more complicated. I think it\u0027s more likely we\u0027ll come back to this down the line and replace it when Python 3.9 is no longer a going concern.","commit_id":"ae1fb9f6040803e9e2f28d6ec9b1e2578aad6a57"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c6ec0ee088ab1df1bc7706a5927bcba2f6569e13","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    request_body_schema: ty.Dict[str, ty.Any],"},{"line_number":172,"context_line":"    min_version: ty.Optional[str] \u003d None,"},{"line_number":173,"context_line":"    max_version: ty.Optional[str] \u003d None,"},{"line_number":174,"context_line":"):"},{"line_number":175,"context_line":"    \"\"\"Register a schema to validate request body."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    Registered schema will be used for validating request body just before"}],"source_content_type":"text/x-python","patch_set":2,"id":"c4aeb31b_a937bd13","line":174,"updated":"2024-12-09 15:10:32.000000000","message":"the return type is really a callable correct?","commit_id":"ae1fb9f6040803e9e2f28d6ec9b1e2578aad6a57"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9dd424431bdb65f84bdfc294c4fe5d5a959bd6","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    request_body_schema: ty.Dict[str, ty.Any],"},{"line_number":172,"context_line":"    min_version: ty.Optional[str] \u003d None,"},{"line_number":173,"context_line":"    max_version: ty.Optional[str] \u003d None,"},{"line_number":174,"context_line":"):"},{"line_number":175,"context_line":"    \"\"\"Register a schema to validate request body."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    Registered schema will be used for validating request body just before"}],"source_content_type":"text/x-python","patch_set":2,"id":"d2f1b9e7_fe9bb10b","line":174,"in_reply_to":"c4aeb31b_a937bd13","updated":"2024-12-09 15:31:12.000000000","message":"It is, yes, but to do this properly I really need to use ParamSpec which is only available in 3.10 [1] or in typing-extensions before then (which is not currently a dependency). As such, I\u0027ve removed this since I felt no hint was better than false hints.\n\n[1]  https://docs.python.org/3/library/typing.html#typing.ParamSpec","commit_id":"ae1fb9f6040803e9e2f28d6ec9b1e2578aad6a57"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fbbf95bc3cb77090260eeb2d019bc5bf316b3e56","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    request_body_schema: ty.Dict[str, ty.Any],"},{"line_number":172,"context_line":"    min_version: ty.Optional[str] \u003d None,"},{"line_number":173,"context_line":"    max_version: ty.Optional[str] \u003d None,"},{"line_number":174,"context_line":"):"},{"line_number":175,"context_line":"    \"\"\"Register a schema to validate request body."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    Registered schema will be used for validating request body just before"}],"source_content_type":"text/x-python","patch_set":2,"id":"2e667459_13e9b303","line":174,"in_reply_to":"d2f1b9e7_fe9bb10b","updated":"2025-01-28 12:22:04.000000000","message":"Done","commit_id":"ae1fb9f6040803e9e2f28d6ec9b1e2578aad6a57"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"831b2f503342f31c1a9e078ec628011be89dec13","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                # it doesn\u0027t make sense to have multiple schemas if one of them"},{"line_number":81,"context_line":"                # is unversioned (i.e. applies to everything)"},{"line_number":82,"context_line":"                assert not prev_max_version.is_null()"},{"line_number":83,"context_line":"                assert not min_version.is_null()"},{"line_number":84,"context_line":"                # there should not be any gaps in schema coverage"},{"line_number":85,"context_line":"                assert prev_max_version.ver_minor + 1 \u003d\u003d min_version.ver_minor"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"db4ca21e_d1b9c44d","line":83,"range":{"start_line":83,"start_character":16,"end_line":83,"end_character":48},"updated":"2025-05-29 21:03:38.000000000","message":"just a nit if you want to do in followup but I am ok if you prefer to leave it as it is.\n\nWe can have min_version as None for v2 legacy API[1] though could not find if any API passing None. I will say if we dissallow None then let\u0027s update L148 also?\n https://review.opendev.org/c/openstack/nova/+/936365/8/nova/api/validation/__init__.py#148","commit_id":"89977c366174d942da6ffdcfd6f02080d7bacf2a"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"831b2f503342f31c1a9e078ec628011be89dec13","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                assert not prev_max_version.is_null()"},{"line_number":83,"context_line":"                assert not min_version.is_null()"},{"line_number":84,"context_line":"                # there should not be any gaps in schema coverage"},{"line_number":85,"context_line":"                assert prev_max_version.ver_minor + 1 \u003d\u003d min_version.ver_minor"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            prev_max_version \u003d max_version"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"40b0ce0a_ba33c615","line":85,"range":{"start_line":85,"start_character":0,"end_line":85,"end_character":78},"updated":"2025-05-29 21:03:38.000000000","message":"++ for this assert","commit_id":"89977c366174d942da6ffdcfd6f02080d7bacf2a"}]}
