)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fe572ecbbea1c7c037c7ffd635af90539101c5ee","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4d008c65_d8391d39","updated":"2026-06-12 15:41:20.000000000","message":"-1 just to catch your eye. Feel free to disagree","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c7c66966123535991e0c91b94c0fc0cfd33fa3e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"7a05f552_6dc810fc","updated":"2026-06-12 16:35:14.000000000","message":"+W since my change is unrelated and can be done separately. If you do want to fix it now, feel free to carry my +2/+W forward","commit_id":"75eeb37d2e374faafc7e855d3b17da75e53ace43"}],"oslo_config/cfg.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fe572ecbbea1c7c037c7ffd635af90539101c5ee","unresolved":true,"context_lines":[{"line_number":1373,"context_line":"    :param name: the option\u0027s name"},{"line_number":1374,"context_line":"    :param max_length: If positive integer, the value must be less than or"},{"line_number":1375,"context_line":"                       equal to this parameter."},{"line_number":1376,"context_line":"    :param schemes: list of valid URI schemes, e.g. \u0027https\u0027, \u0027ftp\u0027, \u0027git\u0027"},{"line_number":1377,"context_line":"    :param \\*\\*kwargs: arbitrary keyword arguments passed to :class:`Opt`"},{"line_number":1378,"context_line":""},{"line_number":1379,"context_line":"    .. versionadded:: 3.12"}],"source_content_type":"text/x-python","patch_set":1,"id":"52b809f2_056cfecf","line":1376,"updated":"2026-06-12 15:41:20.000000000","message":"```suggestion\n    :param schemes: iterable of valid URI schemes, e.g. \u0027https\u0027, \u0027ftp\u0027,\n        \u0027git\u0027\n```","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"515fd55a01c9841b193b2da9defcd4248d693af8","unresolved":false,"context_lines":[{"line_number":1373,"context_line":"    :param name: the option\u0027s name"},{"line_number":1374,"context_line":"    :param max_length: If positive integer, the value must be less than or"},{"line_number":1375,"context_line":"                       equal to this parameter."},{"line_number":1376,"context_line":"    :param schemes: list of valid URI schemes, e.g. \u0027https\u0027, \u0027ftp\u0027, \u0027git\u0027"},{"line_number":1377,"context_line":"    :param \\*\\*kwargs: arbitrary keyword arguments passed to :class:`Opt`"},{"line_number":1378,"context_line":""},{"line_number":1379,"context_line":"    .. versionadded:: 3.12"}],"source_content_type":"text/x-python","patch_set":1,"id":"17b52940_9894fbcc","line":1376,"in_reply_to":"52b809f2_056cfecf","updated":"2026-06-12 15:54:13.000000000","message":"Done","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fe572ecbbea1c7c037c7ffd635af90539101c5ee","unresolved":true,"context_lines":[{"line_number":1388,"context_line":"        self,"},{"line_number":1389,"context_line":"        name: str,"},{"line_number":1390,"context_line":"        max_length: int | None \u003d None,"},{"line_number":1391,"context_line":"        schemes: Sequence[str] | None \u003d None,"},{"line_number":1392,"context_line":"        **kwargs: Any,"},{"line_number":1393,"context_line":"    ) -\u003e None:"},{"line_number":1394,"context_line":"        type \u003d types.URI(max_length\u003dmax_length, schemes\u003dschemes)"}],"source_content_type":"text/x-python","patch_set":1,"id":"d12a092d_6e318dd5","line":1391,"updated":"2026-06-12 15:41:20.000000000","message":"Per my comment in the next file, I wonder if this should be `Iterable`","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"515fd55a01c9841b193b2da9defcd4248d693af8","unresolved":false,"context_lines":[{"line_number":1388,"context_line":"        self,"},{"line_number":1389,"context_line":"        name: str,"},{"line_number":1390,"context_line":"        max_length: int | None \u003d None,"},{"line_number":1391,"context_line":"        schemes: Sequence[str] | None \u003d None,"},{"line_number":1392,"context_line":"        **kwargs: Any,"},{"line_number":1393,"context_line":"    ) -\u003e None:"},{"line_number":1394,"context_line":"        type \u003d types.URI(max_length\u003dmax_length, schemes\u003dschemes)"}],"source_content_type":"text/x-python","patch_set":1,"id":"cd07b447_c59d6614","line":1391,"in_reply_to":"d12a092d_6e318dd5","updated":"2026-06-12 15:54:13.000000000","message":"Done","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"}],"oslo_config/types.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fe572ecbbea1c7c037c7ffd635af90539101c5ee","unresolved":true,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            self.choices \u003d None"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        self.lower_case_choices: Sequence[str] | None \u003d None"},{"line_number":140,"context_line":"        if self.choices is not None and self.ignore_case:"},{"line_number":141,"context_line":"            self.lower_case_choices \u003d [c.lower() for c in self.choices]"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"0b93bc89_f8b8d4ed","line":139,"updated":"2026-06-12 15:41:20.000000000","message":"I tend to adopt a variant of Postel\u0027s law/the Robustness Principle and adopt a abstract types for input and concrete types for outputs.  Something like what\u0027s discussed [here](https://medium.com/@tihomir.manushev/applying-the-robustness-principle-to-modern-python-type-hints-7f890092f8b8). Given this is an internal attribute, I wonder if we should be using list here and just wrapping any assignments in `list(...)`?","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"515fd55a01c9841b193b2da9defcd4248d693af8","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            self.choices \u003d None"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        self.lower_case_choices: Sequence[str] | None \u003d None"},{"line_number":140,"context_line":"        if self.choices is not None and self.ignore_case:"},{"line_number":141,"context_line":"            self.lower_case_choices \u003d [c.lower() for c in self.choices]"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"e721d966_754c8095","line":139,"in_reply_to":"0b93bc89_f8b8d4ed","updated":"2026-06-12 15:54:13.000000000","message":"I agree. I\u0027ve reverted this back.","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fe572ecbbea1c7c037c7ffd635af90539101c5ee","unresolved":true,"context_lines":[{"line_number":173,"context_line":"            return str_value"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        # Check for case insensitive"},{"line_number":176,"context_line":"        choices: KeysView[str] | Sequence[str]"},{"line_number":177,"context_line":"        if self.ignore_case:"},{"line_number":178,"context_line":"            assert self.lower_case_choices is not None"},{"line_number":179,"context_line":"            processed_value \u003d str_value.lower()"}],"source_content_type":"text/x-python","patch_set":1,"id":"a8e8c233_557c510d","line":176,"updated":"2026-06-12 15:41:20.000000000","message":"As above, maybe this should have been `list[str]` and we should just wrap the assignments below in `list`? If not, you probably want to use `Iterable` here rather than `Sequence`","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"515fd55a01c9841b193b2da9defcd4248d693af8","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            return str_value"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        # Check for case insensitive"},{"line_number":176,"context_line":"        choices: KeysView[str] | Sequence[str]"},{"line_number":177,"context_line":"        if self.ignore_case:"},{"line_number":178,"context_line":"            assert self.lower_case_choices is not None"},{"line_number":179,"context_line":"            processed_value \u003d str_value.lower()"}],"source_content_type":"text/x-python","patch_set":1,"id":"ae23674f_8aa2aade","line":176,"in_reply_to":"a8e8c233_557c510d","updated":"2026-06-12 15:54:13.000000000","message":"I\u0027ve reverted this.","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fe572ecbbea1c7c037c7ffd635af90539101c5ee","unresolved":true,"context_lines":[{"line_number":1056,"context_line":"    def __init__("},{"line_number":1057,"context_line":"        self,"},{"line_number":1058,"context_line":"        max_length: int | None \u003d None,"},{"line_number":1059,"context_line":"        schemes: Sequence[str] | None \u003d None,"},{"line_number":1060,"context_line":"        type_name: str \u003d \u0027uri value\u0027,"},{"line_number":1061,"context_line":"    ) -\u003e None:"},{"line_number":1062,"context_line":"        super().__init__(type_name\u003dtype_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b3b20985_2d1b5d1f","line":1059,"updated":"2026-06-12 15:41:20.000000000","message":"This can probably be `Iterable`? The difference between the two is that `Sequence` has a size (you can call `len()` on it) while `Iterable` does not (it covers things like generators and iterators too). I don\u0027t think we need size here?","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"515fd55a01c9841b193b2da9defcd4248d693af8","unresolved":false,"context_lines":[{"line_number":1056,"context_line":"    def __init__("},{"line_number":1057,"context_line":"        self,"},{"line_number":1058,"context_line":"        max_length: int | None \u003d None,"},{"line_number":1059,"context_line":"        schemes: Sequence[str] | None \u003d None,"},{"line_number":1060,"context_line":"        type_name: str \u003d \u0027uri value\u0027,"},{"line_number":1061,"context_line":"    ) -\u003e None:"},{"line_number":1062,"context_line":"        super().__init__(type_name\u003dtype_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"f8203313_27202c10","line":1059,"in_reply_to":"b3b20985_2d1b5d1f","updated":"2026-06-12 15:54:13.000000000","message":"Done.\n\nI noticed that usage of pure iterable may cause different behavior than sequence, in case the value is empty (due to the binary check in L1080), though that may not be a blocker for this.","commit_id":"81d0ccbda511d711033d81f6710208bb1078e642"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f3751cff70b1d8232fb8959496c398fe7514664b","unresolved":true,"context_lines":[{"line_number":173,"context_line":"            return str_value"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        # Check for case insensitive"},{"line_number":176,"context_line":"        choices: KeysView[str] | list[str]"},{"line_number":177,"context_line":"        if self.ignore_case:"},{"line_number":178,"context_line":"            assert self.lower_case_choices is not None"},{"line_number":179,"context_line":"            processed_value \u003d str_value.lower()"}],"source_content_type":"text/x-python","patch_set":3,"id":"d6685d40_ca817c9a","line":176,"updated":"2026-06-12 16:34:35.000000000","message":"You could still simplify this to `Iterable`?\n\n```suggestion\n        choices: KeysView[str] | list[str]\n```\n\n```\n\u003e\u003e\u003e from collections.abc import Iterable\n\u003e\u003e\u003e isinstance({\u0027a\u0027: \u0027b\u0027}.keys(), Iterable)\nTrue\n```","commit_id":"75eeb37d2e374faafc7e855d3b17da75e53ace43"}]}
