)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b8e452c5af5ee4e2ea8c47a2361ad39442d35def","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"bedfd60b_a66225f1","updated":"2026-06-25 21:01:34.000000000","message":"Happy to get these comments addressed in a follow up, and probably something @wachirasilvia8@gmail.com may do. Thanks Stephen and Silvia!","commit_id":"915001382887f5261971c4051fd15d2c2e0eae2c"}],"openstackclient/common/envvars.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"821dbaf405fc1b2b8debf10b77cc0dc2124d3bd2","unresolved":true,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from openstackclient.i18n import _"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# TODO(stephenfin): Move this to osc-lib"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def bool_from_str(value: bool | str, strict: bool \u003d False) -\u003e bool:"},{"line_number":22,"context_line":"    true_strings \u003d (\u00271\u0027, \u0027t\u0027, \u0027true\u0027, \u0027on\u0027, \u0027y\u0027, \u0027yes\u0027)"},{"line_number":23,"context_line":"    false_strings \u003d (\u00270\u0027, \u0027f\u0027, \u0027false\u0027, \u0027off\u0027, \u0027n\u0027, \u0027no\u0027)"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a48acb3_3a9d1602","line":21,"range":{"start_line":17,"start_character":1,"end_line":21,"end_character":67},"updated":"2026-06-16 15:10:22.000000000","message":"These have got visually separated. Can you group them together again?","commit_id":"f68f8f5f91d78484858ed877d0cb91ca649a6c2e"},{"author":{"_account_id":38842,"name":"Silvia Wachira","display_name":"Silvia Wachira","email":"wachirasilvia8@gmail.com","username":"Silvia-Wachira"},"change_message_id":"65a42c28bf76ba6c7ce71d56bd2d90a899bf80b0","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from openstackclient.i18n import _"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# TODO(stephenfin): Move this to osc-lib"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def bool_from_str(value: bool | str, strict: bool \u003d False) -\u003e bool:"},{"line_number":22,"context_line":"    true_strings \u003d (\u00271\u0027, \u0027t\u0027, \u0027true\u0027, \u0027on\u0027, \u0027y\u0027, \u0027yes\u0027)"},{"line_number":23,"context_line":"    false_strings \u003d (\u00270\u0027, \u0027f\u0027, \u0027false\u0027, \u0027off\u0027, \u0027n\u0027, \u0027no\u0027)"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"f5b32034_1fe62dc1","line":21,"range":{"start_line":17,"start_character":1,"end_line":21,"end_character":67},"in_reply_to":"1a48acb3_3a9d1602","updated":"2026-06-21 12:40:03.000000000","message":"Done","commit_id":"f68f8f5f91d78484858ed877d0cb91ca649a6c2e"}],"openstackclient/share/utils.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"89a21f68c0e3ed64e9d3c626767d9e958a34bce6","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def extract_key_value_options(pairs):"},{"line_number":27,"context_line":"    result_dict \u003d {}"},{"line_number":28,"context_line":"    duplicate_options \u003d []"},{"line_number":29,"context_line":"    pairs \u003d pairs or {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"44386131_b5e08612","line":26,"updated":"2026-06-10 10:52:11.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"bea9eecf75455bd53f84b0fbf9028d149dee6192"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"89a21f68c0e3ed64e9d3c626767d9e958a34bce6","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    return result_dict"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def format_properties(properties):"},{"line_number":46,"context_line":"    formatted_data \u003d []"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    for item in properties:"}],"source_content_type":"text/x-python","patch_set":7,"id":"4c963f2a_56f5e998","line":45,"updated":"2026-06-10 10:52:11.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"bea9eecf75455bd53f84b0fbf9028d149dee6192"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"89a21f68c0e3ed64e9d3c626767d9e958a34bce6","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    return \"\\n\".join(formatted_data)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def extract_properties(properties):"},{"line_number":54,"context_line":"    result_dict \u003d {}"},{"line_number":55,"context_line":"    for item in properties:"},{"line_number":56,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"09ce7d5c_5f0d58f2","line":53,"updated":"2026-06-10 10:52:11.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"bea9eecf75455bd53f84b0fbf9028d149dee6192"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"89a21f68c0e3ed64e9d3c626767d9e958a34bce6","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    return result_dict"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def extract_extra_specs("},{"line_number":72,"context_line":"    extra_specs, specs_to_add, bool_specs\u003dconstants.BOOL_SPECS"},{"line_number":73,"context_line":"):"},{"line_number":74,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"abcceb4e_c5240b99","line":71,"updated":"2026-06-10 10:52:11.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"bea9eecf75455bd53f84b0fbf9028d149dee6192"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"89a21f68c0e3ed64e9d3c626767d9e958a34bce6","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return extra_specs"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def extract_group_specs(extra_specs, specs_to_add):"},{"line_number":98,"context_line":"    return extract_extra_specs("},{"line_number":99,"context_line":"        extra_specs, specs_to_add, constants.GROUP_BOOL_SPECS"},{"line_number":100,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"2b09d94d_5932b536","line":97,"updated":"2026-06-10 10:52:11.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"bea9eecf75455bd53f84b0fbf9028d149dee6192"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"89a21f68c0e3ed64e9d3c626767d9e958a34bce6","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    )"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"def format_column_headers(columns):"},{"line_number":104,"context_line":"    column_headers \u003d []"},{"line_number":105,"context_line":"    for column in columns:"},{"line_number":106,"context_line":"        column_headers.append("}],"source_content_type":"text/x-python","patch_set":7,"id":"19dc8e59_95848759","line":103,"updated":"2026-06-10 10:52:11.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"bea9eecf75455bd53f84b0fbf9028d149dee6192"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"89a21f68c0e3ed64e9d3c626767d9e958a34bce6","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    return column_headers"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def format_share_group_type(share_group_type, formatter\u003d\u0027table\u0027):"},{"line_number":113,"context_line":"    printable_share_group_type \u003d share_group_type._info"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    is_public \u003d printable_share_group_type.pop(\u0027is_public\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"07caed4b_01b4b817","line":112,"updated":"2026-06-10 10:52:11.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"bea9eecf75455bd53f84b0fbf9028d149dee6192"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"abbf545c36fb460b4993a9c34ca335985a727dc1","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def extract_key_value_options(pairs):"},{"line_number":27,"context_line":"    result_dict \u003d {}"},{"line_number":28,"context_line":"    duplicate_options \u003d []"},{"line_number":29,"context_line":"    pairs \u003d pairs or {}"}],"source_content_type":"text/x-python","patch_set":8,"id":"aae250dc_890dcb2f","line":26,"updated":"2026-06-10 12:53:09.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"57a8edc5ecc891a7e1f7b26f617e9d441d675740"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"abbf545c36fb460b4993a9c34ca335985a727dc1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    return result_dict"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def format_properties(properties):"},{"line_number":46,"context_line":"    formatted_data \u003d []"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    for item in properties:"}],"source_content_type":"text/x-python","patch_set":8,"id":"e805f852_11c24383","line":45,"updated":"2026-06-10 12:53:09.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"57a8edc5ecc891a7e1f7b26f617e9d441d675740"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"abbf545c36fb460b4993a9c34ca335985a727dc1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    return \"\\n\".join(formatted_data)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def extract_properties(properties):"},{"line_number":54,"context_line":"    result_dict \u003d {}"},{"line_number":55,"context_line":"    for item in properties:"},{"line_number":56,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"722821d3_b36f7587","line":53,"updated":"2026-06-10 12:53:09.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"57a8edc5ecc891a7e1f7b26f617e9d441d675740"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"abbf545c36fb460b4993a9c34ca335985a727dc1","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    return result_dict"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def extract_extra_specs("},{"line_number":72,"context_line":"    extra_specs, specs_to_add, bool_specs\u003dconstants.BOOL_SPECS"},{"line_number":73,"context_line":"):"},{"line_number":74,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1d5d87f3_6f620eab","line":71,"updated":"2026-06-10 12:53:09.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"57a8edc5ecc891a7e1f7b26f617e9d441d675740"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"abbf545c36fb460b4993a9c34ca335985a727dc1","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return extra_specs"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def extract_group_specs(extra_specs, specs_to_add):"},{"line_number":98,"context_line":"    return extract_extra_specs("},{"line_number":99,"context_line":"        extra_specs, specs_to_add, constants.GROUP_BOOL_SPECS"},{"line_number":100,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":8,"id":"afa70fbd_bc3a8a67","line":97,"updated":"2026-06-10 12:53:09.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"57a8edc5ecc891a7e1f7b26f617e9d441d675740"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"abbf545c36fb460b4993a9c34ca335985a727dc1","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    )"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"def format_column_headers(columns):"},{"line_number":104,"context_line":"    column_headers \u003d []"},{"line_number":105,"context_line":"    for column in columns:"},{"line_number":106,"context_line":"        column_headers.append("}],"source_content_type":"text/x-python","patch_set":8,"id":"b7aa5ca7_a9945ea6","line":103,"updated":"2026-06-10 12:53:09.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"57a8edc5ecc891a7e1f7b26f617e9d441d675740"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"abbf545c36fb460b4993a9c34ca335985a727dc1","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    return column_headers"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def format_share_group_type(share_group_type, formatter\u003d\u0027table\u0027):"},{"line_number":113,"context_line":"    printable_share_group_type \u003d share_group_type._info"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    is_public \u003d printable_share_group_type.pop(\u0027is_public\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"33ec6a27_02b3bd28","line":112,"updated":"2026-06-10 12:53:09.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"57a8edc5ecc891a7e1f7b26f617e9d441d675740"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"821dbaf405fc1b2b8debf10b77cc0dc2124d3bd2","unresolved":true,"context_lines":[{"line_number":13,"context_line":"#   under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import logging"},{"line_number":16,"context_line":"import typing as t"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from manilaclient.common import constants"},{"line_number":19,"context_line":"from osc_lib import exceptions"}],"source_content_type":"text/x-python","patch_set":11,"id":"b824f734_00fa7f4c","line":16,"updated":"2026-06-16 15:10:22.000000000","message":"Use objects from typing, not a module alias.\n\n```suggestion\nimport typing\n```","commit_id":"f68f8f5f91d78484858ed877d0cb91ca649a6c2e"},{"author":{"_account_id":38842,"name":"Silvia Wachira","display_name":"Silvia Wachira","email":"wachirasilvia8@gmail.com","username":"Silvia-Wachira"},"change_message_id":"65a42c28bf76ba6c7ce71d56bd2d90a899bf80b0","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#   under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import logging"},{"line_number":16,"context_line":"import typing as t"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from manilaclient.common import constants"},{"line_number":19,"context_line":"from osc_lib import exceptions"}],"source_content_type":"text/x-python","patch_set":11,"id":"fed2739b_9686c9f3","line":16,"in_reply_to":"b824f734_00fa7f4c","updated":"2026-06-21 12:40:03.000000000","message":"Done","commit_id":"f68f8f5f91d78484858ed877d0cb91ca649a6c2e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"821dbaf405fc1b2b8debf10b77cc0dc2124d3bd2","unresolved":true,"context_lines":[{"line_number":74,"context_line":"def extract_extra_specs("},{"line_number":75,"context_line":"    extra_specs: dict[str, t.Any],"},{"line_number":76,"context_line":"    specs_to_add: list[str],"},{"line_number":77,"context_line":"    bool_specs: t.Sequence[str] \u003d constants.BOOL_SPECS,"},{"line_number":78,"context_line":") -\u003e dict[str, t.Any]:"},{"line_number":79,"context_line":"    try:"},{"line_number":80,"context_line":"        for item in specs_to_add:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9cd357ad_1a79c63d","line":77,"updated":"2026-06-16 15:10:22.000000000","message":"import `Sequence` from `collections.abc`: the `typing` variant is deprecated. ruff would normally fix this automatically for you if you import the object\n\n\n\n```suggestion\n    bool_specs: Sequence[str] \u003d constants.BOOL_SPECS,\n```","commit_id":"f68f8f5f91d78484858ed877d0cb91ca649a6c2e"},{"author":{"_account_id":38842,"name":"Silvia Wachira","display_name":"Silvia Wachira","email":"wachirasilvia8@gmail.com","username":"Silvia-Wachira"},"change_message_id":"65a42c28bf76ba6c7ce71d56bd2d90a899bf80b0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"def extract_extra_specs("},{"line_number":75,"context_line":"    extra_specs: dict[str, t.Any],"},{"line_number":76,"context_line":"    specs_to_add: list[str],"},{"line_number":77,"context_line":"    bool_specs: t.Sequence[str] \u003d constants.BOOL_SPECS,"},{"line_number":78,"context_line":") -\u003e dict[str, t.Any]:"},{"line_number":79,"context_line":"    try:"},{"line_number":80,"context_line":"        for item in specs_to_add:"}],"source_content_type":"text/x-python","patch_set":11,"id":"cf8cd943_cd30732b","line":77,"in_reply_to":"9cd357ad_1a79c63d","updated":"2026-06-21 12:40:03.000000000","message":"Done","commit_id":"f68f8f5f91d78484858ed877d0cb91ca649a6c2e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"821dbaf405fc1b2b8debf10b77cc0dc2124d3bd2","unresolved":true,"context_lines":[{"line_number":75,"context_line":"    extra_specs: dict[str, t.Any],"},{"line_number":76,"context_line":"    specs_to_add: list[str],"},{"line_number":77,"context_line":"    bool_specs: t.Sequence[str] \u003d constants.BOOL_SPECS,"},{"line_number":78,"context_line":") -\u003e dict[str, t.Any]:"},{"line_number":79,"context_line":"    try:"},{"line_number":80,"context_line":"        for item in specs_to_add:"},{"line_number":81,"context_line":"            (key, value) \u003d item.split(\u0027\u003d\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":11,"id":"cef6e38b_bb80e57d","line":78,"updated":"2026-06-16 15:10:22.000000000","message":"```suggestion\n) -\u003e dict[str, Any]:\n```\n\nditto for the rest of the file","commit_id":"f68f8f5f91d78484858ed877d0cb91ca649a6c2e"},{"author":{"_account_id":38842,"name":"Silvia Wachira","display_name":"Silvia Wachira","email":"wachirasilvia8@gmail.com","username":"Silvia-Wachira"},"change_message_id":"65a42c28bf76ba6c7ce71d56bd2d90a899bf80b0","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    extra_specs: dict[str, t.Any],"},{"line_number":76,"context_line":"    specs_to_add: list[str],"},{"line_number":77,"context_line":"    bool_specs: t.Sequence[str] \u003d constants.BOOL_SPECS,"},{"line_number":78,"context_line":") -\u003e dict[str, t.Any]:"},{"line_number":79,"context_line":"    try:"},{"line_number":80,"context_line":"        for item in specs_to_add:"},{"line_number":81,"context_line":"            (key, value) \u003d item.split(\u0027\u003d\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":11,"id":"d74327c2_48cfb21f","line":78,"in_reply_to":"cef6e38b_bb80e57d","updated":"2026-06-21 12:40:03.000000000","message":"Done","commit_id":"f68f8f5f91d78484858ed877d0cb91ca649a6c2e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"de140afd3869a633e1c5c7263fc2142644439c01","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#   under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import logging"},{"line_number":16,"context_line":"from collections.abc import Sequence"},{"line_number":17,"context_line":"from typing import Any"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from manilaclient.common import constants"}],"source_content_type":"text/x-python","patch_set":13,"id":"165f712e_52c17d84","line":16,"updated":"2026-06-16 22:08:17.000000000","message":"pep8: H306: imports not in alphabetical order (logging, collections.abc.sequence)","commit_id":"2defdb84f1d7eed232f3f56629b0bd56d79ecc94"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"6f968acf3ac356f6b3100dacea4b280be9b0ae78","unresolved":true,"context_lines":[{"line_number":72,"context_line":"    return result_dict"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def extract_extra_specs("},{"line_number":76,"context_line":"    extra_specs: dict[str, Any],"},{"line_number":77,"context_line":"    specs_to_add: list[str],"},{"line_number":78,"context_line":"    bool_specs: Sequence[str] \u003d constants.BOOL_SPECS,"}],"source_content_type":"text/x-python","patch_set":14,"id":"4326fe9b_abeded0f","line":75,"range":{"start_line":75,"start_character":0,"end_line":75,"end_character":24},"updated":"2026-06-19 23:06:05.000000000","message":"I\u0027m surprised we didn\u0027t have something similar in the repo already :)","commit_id":"49878befe9ee12b3196c533984ba0c140c1dc5ee"},{"author":{"_account_id":38842,"name":"Silvia Wachira","display_name":"Silvia Wachira","email":"wachirasilvia8@gmail.com","username":"Silvia-Wachira"},"change_message_id":"65a42c28bf76ba6c7ce71d56bd2d90a899bf80b0","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    return result_dict"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def extract_extra_specs("},{"line_number":76,"context_line":"    extra_specs: dict[str, Any],"},{"line_number":77,"context_line":"    specs_to_add: list[str],"},{"line_number":78,"context_line":"    bool_specs: Sequence[str] \u003d constants.BOOL_SPECS,"}],"source_content_type":"text/x-python","patch_set":14,"id":"c2469fa1_e34046c4","line":75,"range":{"start_line":75,"start_character":0,"end_line":75,"end_character":24},"in_reply_to":"4326fe9b_abeded0f","updated":"2026-06-21 12:40:03.000000000","message":"Done","commit_id":"49878befe9ee12b3196c533984ba0c140c1dc5ee"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b8e452c5af5ee4e2ea8c47a2361ad39442d35def","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def extract_key_value_options("},{"line_number":29,"context_line":"    pairs: dict[str, str] | None,"},{"line_number":30,"context_line":") -\u003e dict[str, str]:"},{"line_number":31,"context_line":"    result_dict \u003d {}"},{"line_number":32,"context_line":"    duplicate_options \u003d []"},{"line_number":33,"context_line":"    pairs \u003d pairs or {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    for attr, value in pairs.items():"},{"line_number":36,"context_line":"        if attr not in result_dict:"},{"line_number":37,"context_line":"            result_dict[attr] \u003d value"},{"line_number":38,"context_line":"        else:"},{"line_number":39,"context_line":"            duplicate_options.append(attr)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    if pairs and len(duplicate_options) \u003e 0:"},{"line_number":42,"context_line":"        duplicate_str \u003d \u0027, \u0027.join(duplicate_options)"},{"line_number":43,"context_line":"        msg \u003d f\"Following options were duplicated: {duplicate_str}\""},{"line_number":44,"context_line":"        raise exceptions.CommandError(msg)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    return result_dict"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"44b68dfd_15a54fdd","line":44,"range":{"start_line":30,"start_character":0,"end_line":44,"end_character":42},"updated":"2026-06-25 21:01:34.000000000","message":"super weird logic; i\u0027m unsure what we were thinking 😀","commit_id":"915001382887f5261971c4051fd15d2c2e0eae2c"}],"openstackclient/tests/unit/share/v2/fakes.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"95f697d733e5ea9700df4a7dc59a4ee5d5049a81","unresolved":true,"context_lines":[{"line_number":883,"context_line":"        return share_replicas"},{"line_number":884,"context_line":""},{"line_number":885,"context_line":""},{"line_number":886,"context_line":"class FakeShareAvailabilityZones:"},{"line_number":887,"context_line":"    \"\"\"Fake one or more availability zones\"\"\""},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"    @staticmethod"},{"line_number":890,"context_line":"    def create_one_availability_zone(attrs\u003dNone):"},{"line_number":891,"context_line":"        \"\"\"Create a fake share availability zone"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"        :param Dictionary attrs:"},{"line_number":894,"context_line":"            A dictionary with all attributes"},{"line_number":895,"context_line":"        :return:"},{"line_number":896,"context_line":"            A FakeResource object, with project_id, resource and so on"},{"line_number":897,"context_line":"        \"\"\""},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"        attrs \u003d attrs or {}"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":"        availability_zone \u003d {"},{"line_number":902,"context_line":"            \"id\": \u0027id-\u0027 + uuid.uuid4().hex,"},{"line_number":903,"context_line":"            \"name\": \u0027name-\u0027 + uuid.uuid4().hex,"},{"line_number":904,"context_line":"            \"created_at\": \u0027time-\u0027 + uuid.uuid4().hex,"},{"line_number":905,"context_line":"            \"updated_at\": \u0027time-\u0027 + uuid.uuid4().hex,"},{"line_number":906,"context_line":"        }"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        availability_zone.update(attrs)"},{"line_number":909,"context_line":"        availability_zone \u003d fakes.FakeResource("},{"line_number":910,"context_line":"            info\u003dcopy.deepcopy(availability_zone), loaded\u003dTrue"},{"line_number":911,"context_line":"        )"},{"line_number":912,"context_line":"        return availability_zone"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"    @staticmethod"},{"line_number":915,"context_line":"    def create_share_availability_zones(attrs\u003dNone, count\u003d2):"},{"line_number":916,"context_line":"        \"\"\"Create multiple availability zones."},{"line_number":917,"context_line":""},{"line_number":918,"context_line":"        :param Dictionary attrs:"},{"line_number":919,"context_line":"            A dictionary with all attributes"},{"line_number":920,"context_line":"        :param Integer count:"},{"line_number":921,"context_line":"            The number of availability zones to be faked"},{"line_number":922,"context_line":"        :return:"},{"line_number":923,"context_line":"            A list of FakeResource objects"},{"line_number":924,"context_line":"        \"\"\""},{"line_number":925,"context_line":""},{"line_number":926,"context_line":"        availability_zones \u003d []"},{"line_number":927,"context_line":"        for n in range(0, count):"},{"line_number":928,"context_line":"            availability_zones.append("},{"line_number":929,"context_line":"                FakeShareAvailabilityZones.create_one_availability_zone(attrs)"},{"line_number":930,"context_line":"            )"},{"line_number":931,"context_line":"        return availability_zones"},{"line_number":932,"context_line":""},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"class FakeShareService:"}],"source_content_type":"text/x-python","patch_set":1,"id":"47f8bc33_c3882e1e","line":931,"range":{"start_line":886,"start_character":0,"end_line":931,"end_character":33},"updated":"2025-12-12 12:50:20.000000000","message":"Probably should delete this since this command will be integrated into the existing availability zone command, and we\u0027ll use SDK when we do that.","commit_id":"5f20ffa059d7b9c82ccc52a2eef51b0207ea7152"},{"author":{"_account_id":38842,"name":"Silvia Wachira","display_name":"Silvia Wachira","email":"wachirasilvia8@gmail.com","username":"Silvia-Wachira"},"change_message_id":"65a42c28bf76ba6c7ce71d56bd2d90a899bf80b0","unresolved":false,"context_lines":[{"line_number":883,"context_line":"        return share_replicas"},{"line_number":884,"context_line":""},{"line_number":885,"context_line":""},{"line_number":886,"context_line":"class FakeShareAvailabilityZones:"},{"line_number":887,"context_line":"    \"\"\"Fake one or more availability zones\"\"\""},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"    @staticmethod"},{"line_number":890,"context_line":"    def create_one_availability_zone(attrs\u003dNone):"},{"line_number":891,"context_line":"        \"\"\"Create a fake share availability zone"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"        :param Dictionary attrs:"},{"line_number":894,"context_line":"            A dictionary with all attributes"},{"line_number":895,"context_line":"        :return:"},{"line_number":896,"context_line":"            A FakeResource object, with project_id, resource and so on"},{"line_number":897,"context_line":"        \"\"\""},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"        attrs \u003d attrs or {}"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":"        availability_zone \u003d {"},{"line_number":902,"context_line":"            \"id\": \u0027id-\u0027 + uuid.uuid4().hex,"},{"line_number":903,"context_line":"            \"name\": \u0027name-\u0027 + uuid.uuid4().hex,"},{"line_number":904,"context_line":"            \"created_at\": \u0027time-\u0027 + uuid.uuid4().hex,"},{"line_number":905,"context_line":"            \"updated_at\": \u0027time-\u0027 + uuid.uuid4().hex,"},{"line_number":906,"context_line":"        }"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        availability_zone.update(attrs)"},{"line_number":909,"context_line":"        availability_zone \u003d fakes.FakeResource("},{"line_number":910,"context_line":"            info\u003dcopy.deepcopy(availability_zone), loaded\u003dTrue"},{"line_number":911,"context_line":"        )"},{"line_number":912,"context_line":"        return availability_zone"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"    @staticmethod"},{"line_number":915,"context_line":"    def create_share_availability_zones(attrs\u003dNone, count\u003d2):"},{"line_number":916,"context_line":"        \"\"\"Create multiple availability zones."},{"line_number":917,"context_line":""},{"line_number":918,"context_line":"        :param Dictionary attrs:"},{"line_number":919,"context_line":"            A dictionary with all attributes"},{"line_number":920,"context_line":"        :param Integer count:"},{"line_number":921,"context_line":"            The number of availability zones to be faked"},{"line_number":922,"context_line":"        :return:"},{"line_number":923,"context_line":"            A list of FakeResource objects"},{"line_number":924,"context_line":"        \"\"\""},{"line_number":925,"context_line":""},{"line_number":926,"context_line":"        availability_zones \u003d []"},{"line_number":927,"context_line":"        for n in range(0, count):"},{"line_number":928,"context_line":"            availability_zones.append("},{"line_number":929,"context_line":"                FakeShareAvailabilityZones.create_one_availability_zone(attrs)"},{"line_number":930,"context_line":"            )"},{"line_number":931,"context_line":"        return availability_zones"},{"line_number":932,"context_line":""},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"class FakeShareService:"}],"source_content_type":"text/x-python","patch_set":1,"id":"8c0f8969_2c3dea08","line":931,"range":{"start_line":886,"start_character":0,"end_line":931,"end_character":33},"in_reply_to":"47f8bc33_c3882e1e","updated":"2026-06-21 12:40:03.000000000","message":"Done","commit_id":"5f20ffa059d7b9c82ccc52a2eef51b0207ea7152"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b8e452c5af5ee4e2ea8c47a2361ad39442d35def","unresolved":true,"context_lines":[{"line_number":455,"context_line":"        return quotas"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"class FakeShareSnapshotIntances:"},{"line_number":459,"context_line":"    \"\"\"Fake a share snapshot instance\"\"\""},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":27,"id":"22ddbdd5_dc9066ca","line":458,"range":{"start_line":458,"start_character":6,"end_line":458,"end_character":31},"updated":"2026-06-25 21:01:34.000000000","message":"typo, will propagate","commit_id":"915001382887f5261971c4051fd15d2c2e0eae2c"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b8e452c5af5ee4e2ea8c47a2361ad39442d35def","unresolved":true,"context_lines":[{"line_number":505,"context_line":"        share_snapshot_instances \u003d []"},{"line_number":506,"context_line":"        for n in range(0, count):"},{"line_number":507,"context_line":"            share_snapshot_instances.append("},{"line_number":508,"context_line":"                FakeShareSnapshot.create_one_snapshot(attrs)"},{"line_number":509,"context_line":"            )"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        return share_snapshot_instances"}],"source_content_type":"text/x-python","patch_set":27,"id":"7437d708_f63676a3","line":508,"range":{"start_line":508,"start_character":34,"end_line":508,"end_character":53},"updated":"2026-06-25 21:01:34.000000000","message":"weird, this should really be calling self.create_one_snapshot_instance - but, things are working because the structures are similar, and are getting overrides..","commit_id":"915001382887f5261971c4051fd15d2c2e0eae2c"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b8e452c5af5ee4e2ea8c47a2361ad39442d35def","unresolved":true,"context_lines":[{"line_number":555,"context_line":"        share_snapshot_instances \u003d []"},{"line_number":556,"context_line":"        for n in range(0, count):"},{"line_number":557,"context_line":"            share_snapshot_instances.append("},{"line_number":558,"context_line":"                FakeShareSnapshot.create_one_snapshot(attrs)"},{"line_number":559,"context_line":"            )"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        return share_snapshot_instances"}],"source_content_type":"text/x-python","patch_set":27,"id":"d52b04d9_65e60046","line":558,"range":{"start_line":558,"start_character":34,"end_line":558,"end_character":53},"updated":"2026-06-25 21:01:34.000000000","message":"same problem","commit_id":"915001382887f5261971c4051fd15d2c2e0eae2c"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b8e452c5af5ee4e2ea8c47a2361ad39442d35def","unresolved":true,"context_lines":[{"line_number":671,"context_line":"        share_transfers \u003d []"},{"line_number":672,"context_line":"        for n in range(0, count):"},{"line_number":673,"context_line":"            share_transfers.append("},{"line_number":674,"context_line":"                FakeShareSnapshot.create_one_snapshot(attrs)"},{"line_number":675,"context_line":"            )"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        return share_transfers"}],"source_content_type":"text/x-python","patch_set":27,"id":"5b647782_3493626f","line":674,"range":{"start_line":674,"start_character":34,"end_line":674,"end_character":53},"updated":"2026-06-25 21:01:34.000000000","message":"same issue, this is a transfer..","commit_id":"915001382887f5261971c4051fd15d2c2e0eae2c"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b8e452c5af5ee4e2ea8c47a2361ad39442d35def","unresolved":true,"context_lines":[{"line_number":681,"context_line":"    \"\"\"Fake one or more snapshot access rules\"\"\""},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"    @staticmethod"},{"line_number":684,"context_line":"    def create_one_access_rule(attrs\u003d{}):"},{"line_number":685,"context_line":"        \"\"\"Create a fake snapshot access rule"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"        :param Dictionary attrs:"}],"source_content_type":"text/x-python","patch_set":27,"id":"bedb8bc3_017e3241","line":684,"range":{"start_line":684,"start_character":31,"end_line":684,"end_character":39},"updated":"2026-06-25 21:01:34.000000000","message":"mutable default argument","commit_id":"915001382887f5261971c4051fd15d2c2e0eae2c"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"b8e452c5af5ee4e2ea8c47a2361ad39442d35def","unresolved":true,"context_lines":[{"line_number":1390,"context_line":"        \"\"\""},{"line_number":1391,"context_line":""},{"line_number":1392,"context_line":"        if share_group_types is None:"},{"line_number":1393,"context_line":"            share_group_types \u003d FakeShareGroupType.share_group_types(count)"},{"line_number":1394,"context_line":""},{"line_number":1395,"context_line":"        return mock.Mock(side_effect\u003dshare_group_types)"},{"line_number":1396,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"c97c65cb_19a2b85e","line":1393,"range":{"start_line":1393,"start_character":51,"end_line":1393,"end_character":68},"updated":"2026-06-25 21:01:34.000000000","message":"probably never invoked; because this doesn\u0027t exist","commit_id":"915001382887f5261971c4051fd15d2c2e0eae2c"}]}
