)]}'
{"cinder/context.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"d71ea2424e6400224e3e4467c47067271968774a","unresolved":true,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":"    def __init__(self,"},{"line_number":84,"context_line":"                 user_id: Optional[str] \u003d None, project_id: str \u003d None,"},{"line_number":85,"context_line":"                 is_admin: bool \u003d None,"},{"line_number":86,"context_line":"                 read_deleted: Optional[str] \u003d \"no\","},{"line_number":87,"context_line":"                 project_name: str \u003d None,"}],"source_content_type":"text/x-python","patch_set":11,"id":"65517d3f_4ee125da","line":84,"range":{"start_line":84,"start_character":26,"end_line":84,"end_character":46},"updated":"2021-08-10 13:27:51.000000000","message":"Sorry to keep pestering you with dumb questions.  Why the Optional here (and not on the other str params)?  I see why you need it at line 86 (if you want callers to be able to use read_deleted\u003dNone as an argument), but I think that mypy infers from the None assignment that the type is Union[str, None].  The mypy check passes with just \u0027user_id: str \u003d None\u0027 here, but maybe you\u0027re looking ahead to some files that aren\u0027t being included in the mypy check yet?","commit_id":"f4eefaa84c2b752db1712d62f9fe43cca29a4db4"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"9cf878ef608bc30f70ac9dea403fa1e368ee6d0a","unresolved":true,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":"    def __init__(self,"},{"line_number":84,"context_line":"                 user_id: Optional[str] \u003d None, project_id: str \u003d None,"},{"line_number":85,"context_line":"                 is_admin: bool \u003d None,"},{"line_number":86,"context_line":"                 read_deleted: Optional[str] \u003d \"no\","},{"line_number":87,"context_line":"                 project_name: str \u003d None,"}],"source_content_type":"text/x-python","patch_set":11,"id":"f8b973c4_7c681b72","line":84,"range":{"start_line":84,"start_character":26,"end_line":84,"end_character":46},"in_reply_to":"65517d3f_4ee125da","updated":"2021-08-10 13:59:20.000000000","message":"project_id: str \u003d None\nis an implicit optional -- in general we should probably lean away from implicit optionals and make them explicit with Optional[].  This would better align with the goal that mypy has to eventually not allow implicit optionals by default.\n\n(Mixing both implicit and explicit optionals here is confusing, and should be cleaned up.)","commit_id":"f4eefaa84c2b752db1712d62f9fe43cca29a4db4"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"baadf8cb23454e798d9b30454729797b5a61dcbb","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    def __init__(self,"},{"line_number":84,"context_line":"                 user_id: Optional[str] \u003d None,"},{"line_number":85,"context_line":"                 project_id: Optional[str] \u003d None,"},{"line_number":86,"context_line":"                 is_admin: bool \u003d None,"},{"line_number":87,"context_line":"                 read_deleted: Optional[str] \u003d \"no\","},{"line_number":88,"context_line":"                 project_name: str \u003d None,"},{"line_number":89,"context_line":"                 remote_address: str \u003d None,"}],"source_content_type":"text/x-python","patch_set":14,"id":"483f4a74_177a79d6","line":86,"updated":"2021-08-10 21:14:50.000000000","message":"I don\u0027t want to nit you to death on this, but you\u0027re still using implied typing here and on lines 88-89.  How do you want to handle this?  I\u0027m OK with a follow-up when it becomes an issue, since I imagine that we\u0027ve already merged code using the implied typing.  Plus, I think it\u0027s better to get the static typing in place rather than be 100% consistent about this issue.\n\nLet me know what you think.  We should probably mention this at the cinder meeting so other reviewers know whether to flag this or not.","commit_id":"9b01a95649a83204eddd865991386ca75f11a88d"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"a6bde11ad21a4f806c4c4392056ca25245158746","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    def __init__(self,"},{"line_number":84,"context_line":"                 user_id: Optional[str] \u003d None,"},{"line_number":85,"context_line":"                 project_id: Optional[str] \u003d None,"},{"line_number":86,"context_line":"                 is_admin: bool \u003d None,"},{"line_number":87,"context_line":"                 read_deleted: Optional[str] \u003d \"no\","},{"line_number":88,"context_line":"                 project_name: str \u003d None,"},{"line_number":89,"context_line":"                 remote_address: str \u003d None,"}],"source_content_type":"text/x-python","patch_set":14,"id":"d3eaf0c7_0cb72a13","line":86,"in_reply_to":"483f4a74_177a79d6","updated":"2021-08-11 12:40:23.000000000","message":"I\u0027m happy to fix this here, just to prevent having to make multiple passes over the same code.","commit_id":"9b01a95649a83204eddd865991386ca75f11a88d"},{"author":{"_account_id":32171,"name":"Girish Chilukuri","email":"girish.chilukuri@ibm.com","username":"GirishChilukuri"},"change_message_id":"632342c0fb655b61c99eb719b8b4ce137d2ca85b","unresolved":true,"context_lines":[{"line_number":84,"context_line":"                 user_id: Optional[str] \u003d None,"},{"line_number":85,"context_line":"                 project_id: Optional[str] \u003d None,"},{"line_number":86,"context_line":"                 is_admin: Optional[bool] \u003d None,"},{"line_number":87,"context_line":"                 read_deleted: Optional[str] \u003d \"no\","},{"line_number":88,"context_line":"                 project_name: Optional[str] \u003d None,"},{"line_number":89,"context_line":"                 remote_address: Optional[str] \u003d None,"},{"line_number":90,"context_line":"                 timestamp\u003dNone,"}],"source_content_type":"text/x-python","patch_set":15,"id":"bd068920_f6050ab9","line":87,"range":{"start_line":87,"start_character":31,"end_line":87,"end_character":39},"updated":"2021-08-19 17:13:43.000000000","message":"I think here the \"Optional\" qualifier is not required, since read_deleted is by default \"no\". \nIf read_deleted is a default argument then this argument can be changed to \u0027read_deleted: str \u003d \"no\"\u0027","commit_id":"b5ac2af0c2910b5d8c87a2b6dbd9b6f5f23a7bca"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"70d3b1840c34e357c88b83fc9f81b50470f79e3d","unresolved":true,"context_lines":[{"line_number":84,"context_line":"                 user_id: Optional[str] \u003d None,"},{"line_number":85,"context_line":"                 project_id: Optional[str] \u003d None,"},{"line_number":86,"context_line":"                 is_admin: Optional[bool] \u003d None,"},{"line_number":87,"context_line":"                 read_deleted: Optional[str] \u003d \"no\","},{"line_number":88,"context_line":"                 project_name: Optional[str] \u003d None,"},{"line_number":89,"context_line":"                 remote_address: Optional[str] \u003d None,"},{"line_number":90,"context_line":"                 timestamp\u003dNone,"}],"source_content_type":"text/x-python","patch_set":15,"id":"10468b8a_4095f3da","line":87,"range":{"start_line":87,"start_character":31,"end_line":87,"end_character":39},"in_reply_to":"bd068920_f6050ab9","updated":"2021-08-20 14:00:20.000000000","message":"@Girish: it depends on whether you want to allow this function to be called with read_deleted\u003dNone, which now that you mention it, we probably don\u0027t, because we aren\u0027t allowing it to be called with boolean values either.\n\nThis is how mypy sees it:\nhttps://paste.opendev.org/show/808219/","commit_id":"b5ac2af0c2910b5d8c87a2b6dbd9b6f5f23a7bca"}],"cinder/manager.py":[{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"cf9e2d5d6c612fc1cd142e4a84c2ea11c2ab921e","unresolved":true,"context_lines":[{"line_number":308,"context_line":"    def _do_cleanup(self, ctxt, vo_resource) -\u003e bool:"},{"line_number":309,"context_line":"        return False"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def init_host(self, service_id, **kwargs) -\u003e None:"},{"line_number":312,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":313,"context_line":"        self.service_id \u003d service_id"},{"line_number":314,"context_line":"        # TODO(geguileo): Once we don\u0027t support MySQL 5.5 anymore we can remove"}],"source_content_type":"text/x-python","patch_set":15,"id":"684808e2_48568d82","side":"PARENT","line":311,"range":{"start_line":311,"start_character":45,"end_line":311,"end_character":54},"updated":"2021-08-20 14:25:13.000000000","message":"should we keep this in order to be consistent with L227 ?","commit_id":"8c46c09ad5d4ae6b87400b678a2bd7afc4af6631"},{"author":{"_account_id":26832,"name":"Stefan Hoffmann","email":"stefan.hoffmann@cloudandheat.com","username":"shoffmann"},"change_message_id":"0cfee1056bb69fbca64cf356f0650ff70b7adbd3","unresolved":true,"context_lines":[{"line_number":106,"context_line":"    def service_topic_queue(self):"},{"line_number":107,"context_line":"        return self.cluster or self.host"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def init_host(self, service_id, added_to_cluster\u003dNone):"},{"line_number":110,"context_line":"        \"\"\"Handle initialization if this is a standalone service."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        A hook point for services to execute tasks before the services are made"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ce34ad5_b2beb0c7","line":109,"updated":"2021-08-20 15:06:53.000000000","message":"Is there a reason you removed the None here?","commit_id":"b5ac2af0c2910b5d8c87a2b6dbd9b6f5f23a7bca"}],"cinder/volume/manager.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"8a542ce591a4b2a5b201090466af59268cc5e0e1","unresolved":true,"context_lines":[{"line_number":1600,"context_line":"    def _clone_image_volume(self,"},{"line_number":1601,"context_line":"                            ctx: context.RequestContext,"},{"line_number":1602,"context_line":"                            volume,"},{"line_number":1603,"context_line":"                            image_meta: dict) -\u003e Union[None,"},{"line_number":1604,"context_line":"                                                       objects.Volume]:"},{"line_number":1605,"context_line":"        # TODO: should this return None?"},{"line_number":1606,"context_line":"        volume_type_id: str \u003d volume.get(\u0027volume_type_id\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ddf35436_08ed28cc","line":1603,"range":{"start_line":1603,"start_character":49,"end_line":1603,"end_character":60},"updated":"2021-08-10 14:42:38.000000000","message":"Use Optional[] instead","commit_id":"40d0fa4123d69dad3e27886bbbff44a299fcd5d4"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"2c6c930cc267a3bae02bfdc9f3a09fdf5602492a","unresolved":false,"context_lines":[{"line_number":1600,"context_line":"    def _clone_image_volume(self,"},{"line_number":1601,"context_line":"                            ctx: context.RequestContext,"},{"line_number":1602,"context_line":"                            volume,"},{"line_number":1603,"context_line":"                            image_meta: dict) -\u003e Union[None,"},{"line_number":1604,"context_line":"                                                       objects.Volume]:"},{"line_number":1605,"context_line":"        # TODO: should this return None?"},{"line_number":1606,"context_line":"        volume_type_id: str \u003d volume.get(\u0027volume_type_id\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"58759b2f_57e3462f","line":1603,"range":{"start_line":1603,"start_character":49,"end_line":1603,"end_character":60},"in_reply_to":"ddf35436_08ed28cc","updated":"2021-08-10 14:51:52.000000000","message":"Done","commit_id":"40d0fa4123d69dad3e27886bbbff44a299fcd5d4"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"8a542ce591a4b2a5b201090466af59268cc5e0e1","unresolved":true,"context_lines":[{"line_number":4885,"context_line":"                              context: context.RequestContext,"},{"line_number":4886,"context_line":"                              volume,"},{"line_number":4887,"context_line":"                              attachment,"},{"line_number":4888,"context_line":"                              force: bool \u003d False) -\u003e Union[None, bool]:"},{"line_number":4889,"context_line":"        \"\"\"Remove a volume connection, but leave attachment."},{"line_number":4890,"context_line":""},{"line_number":4891,"context_line":"        Exits early if the attachment does not have a connector and returns"}],"source_content_type":"text/x-python","patch_set":13,"id":"9795e8a9_b6076377","line":4888,"range":{"start_line":4888,"start_character":54,"end_line":4888,"end_character":64},"updated":"2021-08-10 14:42:38.000000000","message":"Use Optional[] instead.","commit_id":"40d0fa4123d69dad3e27886bbbff44a299fcd5d4"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"2c6c930cc267a3bae02bfdc9f3a09fdf5602492a","unresolved":false,"context_lines":[{"line_number":4885,"context_line":"                              context: context.RequestContext,"},{"line_number":4886,"context_line":"                              volume,"},{"line_number":4887,"context_line":"                              attachment,"},{"line_number":4888,"context_line":"                              force: bool \u003d False) -\u003e Union[None, bool]:"},{"line_number":4889,"context_line":"        \"\"\"Remove a volume connection, but leave attachment."},{"line_number":4890,"context_line":""},{"line_number":4891,"context_line":"        Exits early if the attachment does not have a connector and returns"}],"source_content_type":"text/x-python","patch_set":13,"id":"a2602d22_887ae83f","line":4888,"range":{"start_line":4888,"start_character":54,"end_line":4888,"end_character":64},"in_reply_to":"9795e8a9_b6076377","updated":"2021-08-10 14:51:52.000000000","message":"Done","commit_id":"40d0fa4123d69dad3e27886bbbff44a299fcd5d4"},{"author":{"_account_id":26832,"name":"Stefan Hoffmann","email":"stefan.hoffmann@cloudandheat.com","username":"shoffmann"},"change_message_id":"0cfee1056bb69fbca64cf356f0650ff70b7adbd3","unresolved":true,"context_lines":[{"line_number":3233,"context_line":"    def _get_my_volumes(self,"},{"line_number":3234,"context_line":"                        ctxt: context.RequestContext,"},{"line_number":3235,"context_line":"                        limit: Optional[int] \u003d None,"},{"line_number":3236,"context_line":"                        offset: Optional[int] \u003d None) -\u003e objects.VolumeList:"},{"line_number":3237,"context_line":"        return self._get_my_resources(ctxt, objects.VolumeList,"},{"line_number":3238,"context_line":"                                      limit, offset)"},{"line_number":3239,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"b5a27971_3a3d10c5","line":3236,"updated":"2021-08-20 15:06:53.000000000","message":"Does in makes a difference that here the return value is objects.VolumeList but the called _get_my_resources returns a list?\nI guess objects.VolumeList is only more specific, but both is a \"normal\" list","commit_id":"b5ac2af0c2910b5d8c87a2b6dbd9b6f5f23a7bca"},{"author":{"_account_id":26832,"name":"Stefan Hoffmann","email":"stefan.hoffmann@cloudandheat.com","username":"shoffmann"},"change_message_id":"0cfee1056bb69fbca64cf356f0650ff70b7adbd3","unresolved":true,"context_lines":[{"line_number":4184,"context_line":"            self,"},{"line_number":4185,"context_line":"            context: context.RequestContext,"},{"line_number":4186,"context_line":"            group_snapshot: objects.GroupSnapshot,"},{"line_number":4187,"context_line":"            snapshots: list) -\u003e Tuple[dict, List[dict]]:"},{"line_number":4188,"context_line":"        \"\"\"Creates a group_snapshot.\"\"\""},{"line_number":4189,"context_line":"        model_update \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":4190,"context_line":"        snapshot_model_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":15,"id":"fd171a8d_6cea72b3","line":4187,"updated":"2021-08-20 15:06:53.000000000","message":"Can we specify, what type are the elements of the dicts or is it not needed?","commit_id":"b5ac2af0c2910b5d8c87a2b6dbd9b6f5f23a7bca"}]}
