From 5b5287355efda03173dea279bc5d08e4753849aa Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Thu, 11 Dec 2025 13:26:08 +0000 Subject: [PATCH 1/2] network: Move TaaS commands to a separate entrypoint group Resolve a TODO from the review round. Change-Id: I819f6b8545081037a500bebefcbde898e62fdcc5 Signed-off-by: Stephen Finucane --- openstackclient/network/client.py | 1 + openstackclient/shell.py | 33 ++++++++++++++++++++++++++++--- pyproject.toml | 7 +------ 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/openstackclient/network/client.py b/openstackclient/network/client.py index 5165e1ecd..82a47fb25 100644 --- a/openstackclient/network/client.py +++ b/openstackclient/network/client.py @@ -23,6 +23,7 @@ API_VERSION_OPTION = 'os_network_api_version' API_NAME = 'network' API_VERSIONS = ('2.0', '2') +API_EXTENSIONS = ('taas',) def make_client(instance): diff --git a/openstackclient/shell.py b/openstackclient/shell.py index 6bbbb5f7b..56b315878 100644 --- a/openstackclient/shell.py +++ b/openstackclient/shell.py @@ -118,15 +118,42 @@ def _load_plugins(self): }, ) - # Command groups deal only with major versions - version = '.v' + version_opt.replace('.', '_').split('_')[0] - cmd_group = 'openstack.' + api.replace('-', '_') + version + # Build our command group which we expect to look like: + # + # openstack..vN + # + # Note that command groups deal only with major versions + cmd_group = '.'.join( + [ + 'openstack', + api.replace('-', '_'), + 'v' + version_opt.replace('.', '_').split('_')[0], + ] + ) self.command_manager.add_command_group(cmd_group) self.log.debug( '%(name)s API version %(version)s, cmd group %(group)s', {'name': api, 'version': version_opt, 'group': cmd_group}, ) + mod_extensions = getattr(mod, 'API_EXTENSIONS', None) + if not mod_extensions: + continue + + for extension in mod_extensions: + extension_cmd_group = '.'.join([cmd_group, extension]) + self.command_manager.add_command_group(extension_cmd_group) + self.log.debug( + '%(name)s API version %(version)s ' + '(%(extension)s extension), cmd group %(group)s', + { + 'name': api, + 'version': version_opt, + 'extension': extension, + 'group': cmd_group, + }, + ) + def _load_commands(self): """Load commands via cliff/stevedore diff --git a/pyproject.toml b/pyproject.toml index dc2cbf386..95b6de098 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,6 @@ authors = [ readme = {file = "README.rst", content-type = "text/x-rst"} license = {text = "Apache-2.0"} dynamic = ["version", "dependencies"] -# dependencies = [ ] requires-python = ">=3.10" classifiers = [ "Environment :: OpenStack", @@ -27,10 +26,6 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] -# [project.optional-dependencies] -# test = [ -# ] - [project.urls] Homepage = "https://docs.openstack.org/python-openstackclient/" Repository = "https://opendev.org/openstack/python-openstackclient/" @@ -540,7 +535,7 @@ subnet_pool_set = "openstackclient.network.v2.subnet_pool:SetSubnetPool" subnet_pool_show = "openstackclient.network.v2.subnet_pool:ShowSubnetPool" subnet_pool_unset = "openstackclient.network.v2.subnet_pool:UnsetSubnetPool" -# Tap-as-a-Service +[project.entry-points."openstack.network.v2.taas"] tap_flow_create = "openstackclient.network.v2.taas.tap_flow:CreateTapFlow" tap_flow_delete = "openstackclient.network.v2.taas.tap_flow:DeleteTapFlow" tap_flow_list = "openstackclient.network.v2.taas.tap_flow:ListTapFlow" From 87df8961738d78fb25639e9ff46087d485513c2e Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Fri, 13 Feb 2026 15:23:39 +0000 Subject: [PATCH 2/2] trivial: Enable ruff-specific (RUF) rules Change-Id: I60cc0c22c692414f758df431c049e51b1baecfc7 Signed-off-by: Stephen Finucane --- openstackclient/api/api.py | 2 +- openstackclient/common/progressbar.py | 2 +- openstackclient/common/quota.py | 6 ++--- openstackclient/compute/v2/server.py | 8 +++--- openstackclient/identity/common.py | 2 +- .../identity/v2_0/role_assignment.py | 2 +- .../identity/v3/identity_provider.py | 4 +-- openstackclient/identity/v3/role.py | 6 +++-- openstackclient/image/v1/image.py | 4 +-- openstackclient/network/utils.py | 16 +++++++----- .../network/v2/network_segment_range.py | 23 ++++++++++------ openstackclient/tests/functional/base.py | 2 +- .../functional/identity/v3/test_project.py | 2 +- .../tests/functional/network/v2/common.py | 2 +- .../functional/volume/v2/test_volume_type.py | 4 +-- .../functional/volume/v3/test_volume_type.py | 4 +-- .../tests/unit/common/test_quota.py | 6 ++--- .../tests/unit/compute/v2/test_flavor.py | 3 ++- .../tests/unit/compute/v2/test_server.py | 12 ++++----- .../tests/unit/identity/v3/test_group.py | 9 +++---- .../tests/unit/identity/v3/test_user.py | 2 +- .../tests/unit/image/v2/test_image.py | 22 ++++++++-------- .../unit/network/v2/test_address_group.py | 4 +-- .../network/v2/test_floating_ip_network.py | 3 ++- .../v2/test_floating_ip_port_forwarding.py | 26 +++++++++---------- .../unit/network/v2/test_network_agent.py | 4 +-- .../test_network_auto_allocated_topology.py | 6 ++--- .../unit/network/v2/test_network_flavor.py | 4 +-- .../unit/network/v2/test_network_qos_rule.py | 4 +-- .../unit/network/v2/test_network_rbac.py | 2 +- .../unit/network/v2/test_network_segment.py | 2 +- .../network/v2/test_network_segment_range.py | 17 +++++------- .../unit/network/v2/test_network_trunk.py | 2 +- .../tests/unit/network/v2/test_router.py | 13 ++++------ .../v2/test_security_group_rule_compute.py | 6 +++-- .../tests/unit/network/v2/test_subnet.py | 3 ++- .../tests/unit/network/v2/test_subnet_pool.py | 3 ++- .../unit/volume/v2/test_volume_backup.py | 6 +---- .../unit/volume/v2/test_volume_snapshot.py | 3 ++- .../tests/unit/volume/v2/test_volume_type.py | 6 ++--- .../unit/volume/v3/test_volume_backup.py | 6 +---- .../unit/volume/v3/test_volume_snapshot.py | 3 ++- .../tests/unit/volume/v3/test_volume_type.py | 6 ++--- openstackclient/volume/v2/volume.py | 2 +- openstackclient/volume/v3/volume.py | 2 +- pyproject.toml | 9 ++++++- 46 files changed, 145 insertions(+), 140 deletions(-) diff --git a/openstackclient/api/api.py b/openstackclient/api/api.py index 5f78b0ee5..eae73eea6 100644 --- a/openstackclient/api/api.py +++ b/openstackclient/api/api.py @@ -254,7 +254,7 @@ def find_bulk(self, path, **kwargs): items = self.list(path) if isinstance(items, dict): # strip off the enclosing dict - key = list(items.keys())[0] + key = next(iter(items.keys())) items = items[key] ret = [] diff --git a/openstackclient/common/progressbar.py b/openstackclient/common/progressbar.py index 2852bb250..49eb6d6df 100644 --- a/openstackclient/common/progressbar.py +++ b/openstackclient/common/progressbar.py @@ -40,7 +40,7 @@ def _display_progress_bar(self, size_read): # Output something like this: [==========> ] 49% sys.stdout.write( '\r[{:<30}] {:.0%}'.format( - '=' * int(round(self._percent * 29)) + '>', self._percent + '=' * round(self._percent * 29) + '>', self._percent ) ) sys.stdout.flush() diff --git a/openstackclient/common/quota.py b/openstackclient/common/quota.py index 0e7edf48f..c0e98a836 100644 --- a/openstackclient/common/quota.py +++ b/openstackclient/common/quota.py @@ -827,13 +827,11 @@ def _normalize_names(section: dict) -> None: _normalize_names(info["usage"]) # Remove the 'id' field since it's not very useful - if 'id' in info: - del info['id'] + info.pop('id', None) # Remove the sdk-derived fields for field in ('location', 'name', 'force'): - if field in info: - del info[field] + info.pop(field, None) if not parsed_args.usage: result = [{'resource': k, 'limit': v} for k, v in info.items()] diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index a52657c96..67a6a22c5 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -940,9 +940,9 @@ def __call__(self, parser, namespace, values, option_string=None): } for kv_str in values.split(','): - k, sep, v = kv_str.partition('=') + k, _sep, v = kv_str.partition('=') - if k not in list(info) + ['tag'] or not v: + if k not in [*list(info), 'tag'] or not v: msg = _( "Invalid argument %s; argument must be of form " "'net-id=net-uuid,port-id=port-uuid,v4-fixed-ip=ip-addr," @@ -975,7 +975,7 @@ def __call__(self, parser, namespace, values, option_string=None): if getattr(namespace, self.dest, None) is None: setattr(namespace, self.dest, []) - dev_name, sep, dev_map = values.partition('=') + dev_name, _sep, dev_map = values.partition('=') dev_map = dev_map.split(':') if dev_map else dev_map if not dev_name or not dev_map or len(dev_map) > 4: msg = _( @@ -5017,7 +5017,7 @@ def take_action(self, parsed_args): ip_address_family, ) - cmd = ' '.join(['ssh', ip_address] + args) + cmd = ' '.join(['ssh', ip_address, *args]) LOG.debug('ssh command: %s', cmd) # we intentionally pass through user-provided arguments and run this in # the user's shell diff --git a/openstackclient/identity/common.py b/openstackclient/identity/common.py index f33c37033..9de1c4cbb 100644 --- a/openstackclient/identity/common.py +++ b/openstackclient/identity/common.py @@ -180,7 +180,7 @@ def _get_token_resource(client, resource, parsed_name, parsed_domain=None): return parsed_name return obj['id'] if obj['name'] == parsed_name else parsed_name # diaper defense in case parsing the token fails - except Exception: # noqa + except Exception: return parsed_name diff --git a/openstackclient/identity/v2_0/role_assignment.py b/openstackclient/identity/v2_0/role_assignment.py index 0aa800ef8..eab7522a5 100644 --- a/openstackclient/identity/v2_0/role_assignment.py +++ b/openstackclient/identity/v2_0/role_assignment.py @@ -17,7 +17,7 @@ from osc_lib import utils from openstackclient import command -from openstackclient.i18n import _ # noqa +from openstackclient.i18n import _ class ListRoleAssignment(command.Lister): diff --git a/openstackclient/identity/v3/identity_provider.py b/openstackclient/identity/v3/identity_provider.py index f1af03f05..c085afea1 100644 --- a/openstackclient/identity/v3/identity_provider.py +++ b/openstackclient/identity/v3/identity_provider.py @@ -188,13 +188,13 @@ def get_parser(self, prog_name): parser.add_argument( '--id', metavar='', - help=_('The Identity Providers’ ID attribute'), + help=_('Filter identity providers by ID'), ) parser.add_argument( '--enabled', dest='enabled', action='store_true', - help=_('The Identity Providers that are enabled will be returned'), + help=_('List only enabled identity providers'), ) return parser diff --git a/openstackclient/identity/v3/role.py b/openstackclient/identity/v3/role.py index 3c580d6f8..d8f66e1eb 100644 --- a/openstackclient/identity/v3/role.py +++ b/openstackclient/identity/v3/role.py @@ -416,8 +416,10 @@ def take_action(self, parsed_args): return ( ('ID', 'Name', 'Domain'), ( - utils.get_item_properties(s, ('id', 'name')) - + (domain.name,) + ( + *utils.get_item_properties(s, ('id', 'name')), + domain.name, + ) for s in data ), ) diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py index 0ea7eca71..cf0f68919 100644 --- a/openstackclient/image/v1/image.py +++ b/openstackclient/image/v1/image.py @@ -299,7 +299,7 @@ def take_action(self, parsed_args): volume_client.volumes, parsed_args.volume, ) - response, body = volume_client.volumes.upload_to_image( + _response, body = volume_client.volumes.upload_to_image( source_volume.id, parsed_args.force, parsed_args.name, @@ -498,7 +498,7 @@ def take_action(self, parsed_args): if parsed_args.property: # NOTE(dtroyer): coerce to a list to subscript it in py3 - attr, value = list(parsed_args.property.items())[0] + attr, value = next(iter(parsed_args.property.items())) api_utils.simple_filter( images, attr=attr, diff --git a/openstackclient/network/utils.py b/openstackclient/network/utils.py index 30c0da064..43ffea679 100644 --- a/openstackclient/network/utils.py +++ b/openstackclient/network/utils.py @@ -78,7 +78,7 @@ def str2dict(strdict: str) -> dict[str, str]: else: kvlist[i - 1] = f"{kvlist[i - 1]};{kv}" for kv in kvlist: - key, sep, value = kv.partition(':') + key, value = kv.split(':', 1) result[key] = value return result @@ -173,11 +173,15 @@ def is_ipv6_protocol(protocol): # However, while the OSC CLI doesn't document the protocol, # the code must still handle it. In addition, handle both # protocol names and numbers. - if ( - protocol is not None - and protocol.startswith('ipv6-') - or protocol in ['icmpv6', '41', '43', '44', '58', '59', '60'] - ): + if (protocol is not None and protocol.startswith('ipv6-')) or protocol in [ + 'icmpv6', + '41', + '43', + '44', + '58', + '59', + '60', + ]: return True else: return False diff --git a/openstackclient/network/v2/network_segment_range.py b/openstackclient/network/v2/network_segment_range.py index c8b9a0e4c..f0172a685 100644 --- a/openstackclient/network/v2/network_segment_range.py +++ b/openstackclient/network/v2/network_segment_range.py @@ -406,14 +406,21 @@ def take_action(self, parsed_args): for s in data: props = utils.get_item_properties(s, columns) if ( - parsed_args.available - and _is_prop_empty(columns, props, 'available') - or parsed_args.unavailable - and not _is_prop_empty(columns, props, 'available') - or parsed_args.used - and _is_prop_empty(columns, props, 'used') - or parsed_args.unused - and not _is_prop_empty(columns, props, 'used') + ( + parsed_args.available + and _is_prop_empty(columns, props, 'available') + ) + or ( + parsed_args.unavailable + and not _is_prop_empty(columns, props, 'available') + ) + or ( + parsed_args.used and _is_prop_empty(columns, props, 'used') + ) + or ( + parsed_args.unused + and not _is_prop_empty(columns, props, 'used') + ) ): continue if parsed_args.long: diff --git a/openstackclient/tests/functional/base.py b/openstackclient/tests/functional/base.py index 96c9accf6..ee3006261 100644 --- a/openstackclient/tests/functional/base.py +++ b/openstackclient/tests/functional/base.py @@ -92,7 +92,7 @@ def openstack( format_args.append('-f json') output = execute( - ' '.join(['openstack'] + auth_args + [cmd] + format_args), + ' '.join(['openstack', *auth_args, cmd, *format_args]), fail_ok=fail_ok, ) diff --git a/openstackclient/tests/functional/identity/v3/test_project.py b/openstackclient/tests/functional/identity/v3/test_project.py index 7a66c1851..1804fd495 100644 --- a/openstackclient/tests/functional/identity/v3/test_project.py +++ b/openstackclient/tests/functional/identity/v3/test_project.py @@ -105,6 +105,6 @@ def test_project_show_with_parents_children(self): f'{self.project_name}', parse_output=True, ) - for attr_name in self.PROJECT_FIELDS + ['parents', 'subtree']: + for attr_name in [*self.PROJECT_FIELDS, 'parents', 'subtree']: self.assertIn(attr_name, output) self.assertEqual(self.project_name, output.get('name')) diff --git a/openstackclient/tests/functional/network/v2/common.py b/openstackclient/tests/functional/network/v2/common.py index 248758a84..245297bd9 100644 --- a/openstackclient/tests/functional/network/v2/common.py +++ b/openstackclient/tests/functional/network/v2/common.py @@ -84,7 +84,7 @@ def _list_tag_check(self, project_id, expected): parse_output=True, ) for name, tags in expected: - net = [n for n in cmd_output if n['Name'] == name][0] + net = next(n for n in cmd_output if n['Name'] == name) self.assertEqual(set(tags), set(net['Tags'])) def _create_resource_for_tag_test(self, name, args): diff --git a/openstackclient/tests/functional/volume/v2/test_volume_type.py b/openstackclient/tests/functional/volume/v2/test_volume_type.py index 80bf85a5b..c80e6c154 100644 --- a/openstackclient/tests/functional/volume/v2/test_volume_type.py +++ b/openstackclient/tests/functional/volume/v2/test_volume_type.py @@ -173,9 +173,9 @@ def test_encryption_type(self): 'volume type list --encryption-type', parse_output=True, ) - encryption_output = [ + encryption_output = next( t['Encryption'] for t in cmd_output if t['Name'] == encryption_type - ][0] + ) expected = { 'provider': 'LuksEncryptor', 'cipher': 'aes-xts-plain64', diff --git a/openstackclient/tests/functional/volume/v3/test_volume_type.py b/openstackclient/tests/functional/volume/v3/test_volume_type.py index 421b3224f..cda56b004 100644 --- a/openstackclient/tests/functional/volume/v3/test_volume_type.py +++ b/openstackclient/tests/functional/volume/v3/test_volume_type.py @@ -173,9 +173,9 @@ def test_encryption_type(self): 'volume type list --encryption-type', parse_output=True, ) - encryption_output = [ + encryption_output = next( t['Encryption'] for t in cmd_output if t['Name'] == encryption_type - ][0] + ) expected = { 'provider': 'LuksEncryptor', 'cipher': 'aes-xts-plain64', diff --git a/openstackclient/tests/unit/common/test_quota.py b/openstackclient/tests/unit/common/test_quota.py index 7bfb2e7f2..833d71fe7 100644 --- a/openstackclient/tests/unit/common/test_quota.py +++ b/openstackclient/tests/unit/common/test_quota.py @@ -458,7 +458,7 @@ def test_quota_set(self): 'floating_ips': floating_ip_num, 'fixed_ips': fix_ip_num, 'injected_files': injected_file_num, - 'injected_file_content_bytes': injected_file_size_num, # noqa: E501 + 'injected_file_content_bytes': injected_file_size_num, 'injected_file_path_bytes': injected_path_size_num, 'key_pairs': key_pair_num, 'cores': core_num, @@ -729,7 +729,7 @@ def test_quota_set_with_class(self): kwargs_compute = { 'injected_files': injected_file_num, - 'injected_file_content_bytes': injected_file_size_num, # noqa: E501 + 'injected_file_content_bytes': injected_file_size_num, 'injected_file_path_bytes': injected_path_size_num, 'key_pairs': key_pair_num, 'cores': core_num, @@ -827,7 +827,7 @@ def test_quota_set_default(self): kwargs_compute = { 'injected_files': injected_file_num, - 'injected_file_content_bytes': injected_file_size_num, # noqa: E501 + 'injected_file_content_bytes': injected_file_size_num, 'injected_file_path_bytes': injected_path_size_num, 'key_pairs': key_pair_num, 'cores': core_num, diff --git a/openstackclient/tests/unit/compute/v2/test_flavor.py b/openstackclient/tests/unit/compute/v2/test_flavor.py index 25bc8eaa7..6c9104bbb 100644 --- a/openstackclient/tests/unit/compute/v2/test_flavor.py +++ b/openstackclient/tests/unit/compute/v2/test_flavor.py @@ -494,7 +494,8 @@ def setUp(self): 'VCPUs', 'Is Public', ) - self.columns_long = self.columns + ( + self.columns_long = ( + *self.columns, 'Swap', 'RXTX Factor', 'Properties', diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 8da351676..b5f77aff7 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -4865,7 +4865,7 @@ def test_server_list_column_option(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + columns, _data = self.cmd.take_action(parsed_args) self.compute_client.servers.assert_called_with(**self.kwargs) self.assertIn('Project ID', columns) @@ -5329,7 +5329,7 @@ def test_server_list_long_with_host_status_v216(self): ] # Add the expected host_status column and data. - columns_long = self.columns_long + ('Host Status',) + columns_long = (*self.columns_long, 'Host Status') self.data2 = tuple( ( s.id, @@ -5560,7 +5560,7 @@ def test_server_list_v269_with_partial_constructs(self): } fake_server = _server.Server(**server_dict) self.servers.append(fake_server) - columns, data = self.cmd.take_action(parsed_args) + _columns, data = self.cmd.take_action(parsed_args) # get the first three servers out since our interest is in the partial # server. next(data) @@ -5708,7 +5708,7 @@ def test_server_list_column_option(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + columns, _data = self.cmd.take_action(parsed_args) self.compute_client.servers.assert_called_with(**self.kwargs) self.assertIn('Project ID', columns) @@ -5860,7 +5860,7 @@ def test_server_list_column_option(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + columns, _data = self.cmd.take_action(parsed_args) self.compute_client.servers.assert_called_with(**self.kwargs) self.assertIn('Project ID', columns) @@ -8896,7 +8896,7 @@ def setUp(self): None, # OS-EXT-SRV-ATTR:user_data server.PowerStateColumn( self.server.power_state - ), # OS-EXT-STS:power_state # noqa: E501 + ), # OS-EXT-STS:power_state None, # OS-EXT-STS:task_state None, # OS-EXT-STS:vm_state None, # OS-SRV-USG:launched_at diff --git a/openstackclient/tests/unit/identity/v3/test_group.py b/openstackclient/tests/unit/identity/v3/test_group.py index 598402e07..b3ebfb75c 100644 --- a/openstackclient/tests/unit/identity/v3/test_group.py +++ b/openstackclient/tests/unit/identity/v3/test_group.py @@ -103,7 +103,7 @@ def test_group_add_user_with_error(self, mock_error): except exceptions.CommandError as e: msg = f"1 of 2 users not added to group {self._group.name}." self.assertEqual(msg, str(e)) - msg = f"{self.users[0].name} not added to group {self._group.name}: {str(sdk_exc.ResourceNotFound())}" + msg = f"{self.users[0].name} not added to group {self._group.name}: {sdk_exc.ResourceNotFound()!s}" mock_error.assert_called_once_with(msg) @@ -587,10 +587,7 @@ def test_group_list_long(self): self.identity_sdk_client.groups.assert_called_with() - long_columns = self.columns + ( - 'Domain ID', - 'Description', - ) + long_columns = (*self.columns, 'Domain ID', 'Description') datalist = ( ( self.group.id, @@ -687,7 +684,7 @@ def test_group_remove_user_with_error(self, mock_error): except exceptions.CommandError as e: msg = f"1 of 2 users not removed from group {self._group.id}." self.assertEqual(msg, str(e)) - msg = f"{self.users[0].id} not removed from group {self._group.id}: {str(sdk_exc.ResourceNotFound())}" + msg = f"{self.users[0].id} not removed from group {self._group.id}: {sdk_exc.ResourceNotFound()!s}" mock_error.assert_called_once_with(msg) diff --git a/openstackclient/tests/unit/identity/v3/test_user.py b/openstackclient/tests/unit/identity/v3/test_user.py index 134ba5a0b..00b310e13 100644 --- a/openstackclient/tests/unit/identity/v3/test_user.py +++ b/openstackclient/tests/unit/identity/v3/test_user.py @@ -1773,7 +1773,7 @@ def setUp(self): # Get the command object to test self.cmd = user.ShowUser(self.app, None) - self.identity_client.auth.client.get_user_id.return_value = ( # noqa: E501 + self.identity_client.auth.client.get_user_id.return_value = ( self.user.id ) self.identity_client.tokens.get_token_data.return_value = { diff --git a/openstackclient/tests/unit/image/v2/test_image.py b/openstackclient/tests/unit/image/v2/test_image.py index c9a273ba9..98a18cf91 100644 --- a/openstackclient/tests/unit/image/v2/test_image.py +++ b/openstackclient/tests/unit/image/v2/test_image.py @@ -305,7 +305,7 @@ def test_image_create_import(self, raw_input): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) self.image_client.create_image.assert_called_with( name=self.new_image.name, @@ -336,7 +336,7 @@ def test_image_create_from_volume(self, mock_get_data_f): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) self.volume_sdk_client.upload_volume_to_image.assert_called_once_with( volume.id, @@ -397,7 +397,7 @@ def test_image_create_from_volume_v31(self, mock_get_data_f): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) self.volume_sdk_client.upload_volume_to_image.assert_called_once_with( volume.id, @@ -946,7 +946,7 @@ def test_image_list_marker_option(self, fr_mock): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) self.image_client.images.assert_called_with( marker=self._image.id, ) @@ -966,7 +966,7 @@ def test_image_list_name_option(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) self.image_client.images.assert_called_with( name='abc', # marker=self._image.id @@ -982,7 +982,7 @@ def test_image_list_status_option(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) self.image_client.images.assert_called_with(status='active') def test_image_list_hidden_option(self): @@ -994,7 +994,7 @@ def test_image_list_hidden_option(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) self.image_client.images.assert_called_with(is_hidden=True) def test_image_list_tag_option(self): @@ -1004,7 +1004,7 @@ def test_image_list_tag_option(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) self.image_client.images.assert_called_with(tag=['abc', 'cba']) @@ -1329,7 +1329,7 @@ def test_image_set_membership_accept_with_project_no_owner_change(self): self.image_client.update_image.assert_called() call_args = self.image_client.update_image.call_args if call_args: - args, kwargs = call_args + _args, kwargs = call_args self.assertNotIn('owner_id', kwargs) def test_image_set_membership_reject_with_project_no_owner_change(self): @@ -1366,7 +1366,7 @@ def test_image_set_membership_reject_with_project_no_owner_change(self): self.image_client.update_image.assert_called() call_args = self.image_client.update_image.call_args if call_args: - args, kwargs = call_args + _args, kwargs = call_args self.assertNotIn('owner_id', kwargs) def test_image_set_membership_pending_with_project_no_owner_change(self): @@ -1403,7 +1403,7 @@ def test_image_set_membership_pending_with_project_no_owner_change(self): self.image_client.update_image.assert_called() call_args = self.image_client.update_image.call_args if call_args: - args, kwargs = call_args + _args, kwargs = call_args self.assertNotIn('owner_id', kwargs) def test_image_set_options(self): diff --git a/openstackclient/tests/unit/network/v2/test_address_group.py b/openstackclient/tests/unit/network/v2/test_address_group.py index 48f706631..97218ab0a 100644 --- a/openstackclient/tests/unit/network/v2/test_address_group.py +++ b/openstackclient/tests/unit/network/v2/test_address_group.py @@ -519,7 +519,7 @@ def test_unset_one_address(self): parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) - self.network_client.remove_addresses_from_address_group.assert_called_once_with( # noqa: E501 + self.network_client.remove_addresses_from_address_group.assert_called_once_with( self._address_group, ['10.0.0.2/32'] ) self.assertIsNone(result) @@ -539,7 +539,7 @@ def test_unset_multiple_addresses(self): parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) - self.network_client.remove_addresses_from_address_group.assert_called_once_with( # noqa: E501 + self.network_client.remove_addresses_from_address_group.assert_called_once_with( self._address_group, ['10.0.0.2/32', '2001::/16'] ) self.assertIsNone(result) diff --git a/openstackclient/tests/unit/network/v2/test_floating_ip_network.py b/openstackclient/tests/unit/network/v2/test_floating_ip_network.py index ab0ec176a..685402a76 100644 --- a/openstackclient/tests/unit/network/v2/test_floating_ip_network.py +++ b/openstackclient/tests/unit/network/v2/test_floating_ip_network.py @@ -425,7 +425,8 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork): 'Floating Network', 'Project', ) - columns_long = columns + ( + columns_long = ( + *columns, 'Router', 'Status', 'Description', diff --git a/openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py b/openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py index 33b9011c6..354036d34 100644 --- a/openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +++ b/openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py @@ -39,14 +39,14 @@ def setUp(self): class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding): def setUp(self): super().setUp() - self.new_port_forwarding = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( # noqa: E501 + self.new_port_forwarding = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( attrs={ 'internal_port_id': self.port.id, 'floatingip_id': self.floating_ip.id, } ) - self.new_port_forwarding_with_ranges = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( # noqa: E501 + self.new_port_forwarding_with_ranges = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( use_range=True, attrs={ 'internal_port_id': self.port.id, @@ -144,15 +144,15 @@ def test_create_all_options_with_range(self): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - self.network_client.create_floating_ip_port_forwarding.assert_called_once_with( # noqa: E501 + self.network_client.create_floating_ip_port_forwarding.assert_called_once_with( self.new_port_forwarding.floatingip_id, **{ - 'external_port_range': self.new_port_forwarding_with_ranges.external_port_range, # noqa: E501 - 'internal_ip_address': self.new_port_forwarding_with_ranges.internal_ip_address, # noqa: E501 - 'internal_port_range': self.new_port_forwarding_with_ranges.internal_port_range, # noqa: E501 - 'internal_port_id': self.new_port_forwarding_with_ranges.internal_port_id, # noqa: E501 + 'external_port_range': self.new_port_forwarding_with_ranges.external_port_range, + 'internal_ip_address': self.new_port_forwarding_with_ranges.internal_ip_address, + 'internal_port_range': self.new_port_forwarding_with_ranges.internal_port_range, + 'internal_port_id': self.new_port_forwarding_with_ranges.internal_port_id, 'protocol': self.new_port_forwarding_with_ranges.protocol, - 'description': self.new_port_forwarding_with_ranges.description, # noqa: E501 + 'description': self.new_port_forwarding_with_ranges.description, }, ) self.assertEqual(self.columns, columns) @@ -325,11 +325,11 @@ def test_create_all_options(self): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - self.network_client.create_floating_ip_port_forwarding.assert_called_once_with( # noqa: E501 + self.network_client.create_floating_ip_port_forwarding.assert_called_once_with( self.new_port_forwarding.floatingip_id, **{ 'external_port': self.new_port_forwarding.external_port, - 'internal_ip_address': self.new_port_forwarding.internal_ip_address, # noqa: E501 + 'internal_ip_address': self.new_port_forwarding.internal_ip_address, 'internal_port': self.new_port_forwarding.internal_port, 'internal_port_id': self.new_port_forwarding.internal_port_id, 'protocol': self.new_port_forwarding.protocol, @@ -375,7 +375,7 @@ def test_port_forwarding_delete(self): result = self.cmd.take_action(parsed_args) - self.network_client.delete_floating_ip_port_forwarding.assert_called_once_with( # noqa: E501 + self.network_client.delete_floating_ip_port_forwarding.assert_called_once_with( self.floating_ip.id, self._port_forwarding[0].id, ignore_missing=False, @@ -553,7 +553,7 @@ class TestSetFloatingIPPortForwarding(TestFloatingIPPortForwarding): # The Port Forwarding to set. def setUp(self): super().setUp() - self._port_forwarding = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( # noqa: E501 + self._port_forwarding = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( attrs={ 'floatingip_id': self.floating_ip.id, } @@ -675,7 +675,7 @@ class TestShowFloatingIPPortForwarding(TestFloatingIPPortForwarding): def setUp(self): super().setUp() - self._port_forwarding = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( # noqa: E501 + self._port_forwarding = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( attrs={ 'floatingip_id': self.floating_ip.id, } diff --git a/openstackclient/tests/unit/network/v2/test_network_agent.py b/openstackclient/tests/unit/network/v2/test_network_agent.py index 48b394d7a..1198e1a6b 100644 --- a/openstackclient/tests/unit/network/v2/test_network_agent.py +++ b/openstackclient/tests/unit/network/v2/test_network_agent.py @@ -340,8 +340,8 @@ def test_network_agents_list_routers_with_long_option(self): ) # Add a column 'HA State' and corresponding data. - router_agent_columns = self.columns + ('HA State',) - router_agent_data = [d + ('',) for d in self.data] + router_agent_columns = (*self.columns, 'HA State') + router_agent_data = [(*d, '') for d in self.data] self.assertEqual(router_agent_columns, columns) self.assertEqual(len(router_agent_data), len(list(data))) diff --git a/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py b/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py index d13bd8cf9..502b881da 100644 --- a/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +++ b/openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py @@ -167,7 +167,7 @@ def test_show_dry_run_no_project(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + _columns, _data = self.cmd.take_action(parsed_args) self.network_client.validate_auto_allocated_topology.assert_called_with( None @@ -185,7 +185,7 @@ def test_show_dry_run_project_option(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + _columns, _data = self.cmd.take_action(parsed_args) self.network_client.validate_auto_allocated_topology.assert_called_with( self.project.id @@ -206,7 +206,7 @@ def test_show_dry_run_project_domain_option(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + _columns, _data = self.cmd.take_action(parsed_args) self.network_client.validate_auto_allocated_topology.assert_called_with( self.project.id diff --git a/openstackclient/tests/unit/network/v2/test_network_flavor.py b/openstackclient/tests/unit/network/v2/test_network_flavor.py index 10038e393..4044312a1 100644 --- a/openstackclient/tests/unit/network/v2/test_network_flavor.py +++ b/openstackclient/tests/unit/network/v2/test_network_flavor.py @@ -71,7 +71,7 @@ def test_add_flavor_to_service_profile(self): parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.cmd.take_action(parsed_args) - self.network_client.associate_flavor_with_service_profile.assert_called_once_with( # noqa: E501 + self.network_client.associate_flavor_with_service_profile.assert_called_once_with( self.network_flavor, self.service_profile ) @@ -377,7 +377,7 @@ def test_remove_flavor_from_service_profile(self): parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.cmd.take_action(parsed_args) - self.network_client.disassociate_flavor_from_service_profile.assert_called_once_with( # noqa: E501 + self.network_client.disassociate_flavor_from_service_profile.assert_called_once_with( self.network_flavor, self.service_profile ) diff --git a/openstackclient/tests/unit/network/v2/test_network_qos_rule.py b/openstackclient/tests/unit/network/v2/test_network_qos_rule.py index 430030402..3448589fa 100644 --- a/openstackclient/tests/unit/network/v2/test_network_qos_rule.py +++ b/openstackclient/tests/unit/network/v2/test_network_qos_rule.py @@ -226,7 +226,7 @@ def test_create_default_options(self): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - self.network_client.create_qos_minimum_packet_rate_rule.assert_called_once_with( # noqa: E501 + self.network_client.create_qos_minimum_packet_rate_rule.assert_called_once_with( self.qos_policy.id, **{ 'min_kpps': self.new_rule.min_kpps, @@ -613,7 +613,7 @@ def test_qos_policy_delete(self): self.network_client.find_qos_policy.assert_called_once_with( self.qos_policy.id, ignore_missing=False ) - self.network_client.delete_qos_minimum_packet_rate_rule.assert_called_once_with( # noqa: E501 + self.network_client.delete_qos_minimum_packet_rate_rule.assert_called_once_with( self.new_rule.id, self.qos_policy.id ) self.assertIsNone(result) diff --git a/openstackclient/tests/unit/network/v2/test_network_rbac.py b/openstackclient/tests/unit/network/v2/test_network_rbac.py index d3a719245..656f2624e 100644 --- a/openstackclient/tests/unit/network/v2/test_network_rbac.py +++ b/openstackclient/tests/unit/network/v2/test_network_rbac.py @@ -224,7 +224,7 @@ def test_network_rbac_create_with_target_all_projects(self): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) + _columns, _data = self.cmd.take_action(parsed_args) self.network_client.create_rbac_policy.assert_called_with( **{ diff --git a/openstackclient/tests/unit/network/v2/test_network_segment.py b/openstackclient/tests/unit/network/v2/test_network_segment.py index ab71c3254..5bec65069 100644 --- a/openstackclient/tests/unit/network/v2/test_network_segment.py +++ b/openstackclient/tests/unit/network/v2/test_network_segment.py @@ -250,7 +250,7 @@ class TestListNetworkSegment(TestNetworkSegment): 'Network Type', 'Segment', ) - columns_long = columns + ('Physical Network',) + columns_long = (*columns, 'Physical Network') data = [] for _network_segment in _network_segments: diff --git a/openstackclient/tests/unit/network/v2/test_network_segment_range.py b/openstackclient/tests/unit/network/v2/test_network_segment_range.py index 9c9c900e3..db48fb248 100644 --- a/openstackclient/tests/unit/network/v2/test_network_segment_range.py +++ b/openstackclient/tests/unit/network/v2/test_network_segment_range.py @@ -333,7 +333,7 @@ def test_create_all_options(self): 'shared': self._network_segment_range.shared, 'project_id': mock.ANY, 'network_type': self._network_segment_range.network_type, - 'physical_network': self._network_segment_range.physical_network, # noqa: E501 + 'physical_network': self._network_segment_range.physical_network, 'minimum': self._network_segment_range.minimum, 'maximum': self._network_segment_range.maximum, 'name': self._network_segment_range.name, @@ -450,10 +450,7 @@ class TestListNetworkSegmentRange(TestNetworkSegmentRange): 'Minimum ID', 'Maximum ID', ) - columns_long = columns + ( - 'Used', - 'Available', - ) + columns_long = (*columns, 'Used', 'Available') data = [] for _network_segment_range in _network_segment_ranges: @@ -544,11 +541,11 @@ class TestSetNetworkSegmentRange(TestNetworkSegmentRange): # The network segment range updated. minimum_updated = _network_segment_range.minimum - 5 maximum_updated = _network_segment_range.maximum + 5 - available_updated = ( - list(range(minimum_updated, 104)) - + [105] - + list(range(107, maximum_updated + 1)) - ) + available_updated = [ + *list(range(minimum_updated, 104)), + 105, + *list(range(107, maximum_updated + 1)), + ] _network_segment_range_updated = ( network_fakes.create_one_network_segment_range( attrs={ diff --git a/openstackclient/tests/unit/network/v2/test_network_trunk.py b/openstackclient/tests/unit/network/v2/test_network_trunk.py index 1056c21c3..452870c88 100644 --- a/openstackclient/tests/unit/network/v2/test_network_trunk.py +++ b/openstackclient/tests/unit/network/v2/test_network_trunk.py @@ -468,7 +468,7 @@ class TestListNetworkTrunk(TestNetworkTrunk): ) columns = ('ID', 'Name', 'Parent Port', 'Description') - columns_long = columns + ('Status', 'State', 'Created At', 'Updated At') + columns_long = (*columns, 'Status', 'State', 'Created At', 'Updated At') data = [] for t in new_trunks: data.append((t['id'], t['name'], t['port_id'], t['description'])) diff --git a/openstackclient/tests/unit/network/v2/test_router.py b/openstackclient/tests/unit/network/v2/test_router.py index 6ebb7809e..56faa79a6 100644 --- a/openstackclient/tests/unit/network/v2/test_router.py +++ b/openstackclient/tests/unit/network/v2/test_router.py @@ -711,17 +711,14 @@ class TestListRouter(TestRouter): 'Distributed', 'HA', ) - columns_long = columns + ( + columns_long = ( + *columns, 'Routes', 'External gateway info', 'Availability zones', 'Tags', ) - columns_long_no_az = columns + ( - 'Routes', - 'External gateway info', - 'Tags', - ) + columns_long_no_az = (*columns, 'Routes', 'External gateway info', 'Tags') data = [] for r in routers: @@ -824,7 +821,7 @@ def test_router_list_no_ha_no_distributed(self): with mock.patch.object( self.network_client, "routers", return_value=_routers ): - columns, data = self.cmd.take_action(parsed_args) + columns, _data = self.cmd.take_action(parsed_args) self.assertNotIn("is_distributed", columns) self.assertNotIn("is_ha", columns) @@ -1900,7 +1897,7 @@ def test_show_no_ha_no_distributed(self): with mock.patch.object( self.network_client, "find_router", return_value=_router ): - columns, data = self.cmd.take_action(parsed_args) + columns, _data = self.cmd.take_action(parsed_args) self.assertNotIn("is_distributed", columns) self.assertNotIn("is_ha", columns) diff --git a/openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py b/openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py index 9cab52e39..3c869aabf 100644 --- a/openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +++ b/openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py @@ -411,7 +411,8 @@ class TestListSecurityGroupRuleCompute(compute_fakes.TestComputev2): 'Direction', 'Remote Security Group', ) - expected_columns_no_group = expected_columns_with_group + ( + expected_columns_no_group = ( + *expected_columns_with_group, 'Security Group', ) @@ -429,7 +430,8 @@ class TestListSecurityGroupRuleCompute(compute_fakes.TestComputev2): rule['port_range'], rule['remote_security_group'], ) - expected_rule_no_group = expected_rule_with_group + ( + expected_rule_no_group = ( + *expected_rule_with_group, _security_group_rule['parent_group_id'], ) expected_data_with_group.append(expected_rule_with_group) diff --git a/openstackclient/tests/unit/network/v2/test_subnet.py b/openstackclient/tests/unit/network/v2/test_subnet.py index e59168e51..e4b434215 100644 --- a/openstackclient/tests/unit/network/v2/test_subnet.py +++ b/openstackclient/tests/unit/network/v2/test_subnet.py @@ -798,7 +798,8 @@ class TestListSubnet(TestSubnet): 'Network', 'Subnet', ) - columns_long = columns + ( + columns_long = ( + *columns, 'Project', 'DHCP', 'Name Servers', diff --git a/openstackclient/tests/unit/network/v2/test_subnet_pool.py b/openstackclient/tests/unit/network/v2/test_subnet_pool.py index 013550ec1..eed947bfc 100644 --- a/openstackclient/tests/unit/network/v2/test_subnet_pool.py +++ b/openstackclient/tests/unit/network/v2/test_subnet_pool.py @@ -471,7 +471,8 @@ class TestListSubnetPool(TestSubnetPool): 'Name', 'Prefixes', ) - columns_long = columns + ( + columns_long = ( + *columns, 'Default Prefix Length', 'Address Scope', 'Default Subnet Pool', diff --git a/openstackclient/tests/unit/volume/v2/test_volume_backup.py b/openstackclient/tests/unit/volume/v2/test_volume_backup.py index e7bbb6999..8d7984e80 100644 --- a/openstackclient/tests/unit/volume/v2/test_volume_backup.py +++ b/openstackclient/tests/unit/volume/v2/test_volume_backup.py @@ -220,11 +220,7 @@ class TestBackupList(volume_fakes.TestVolume): 'Incremental', 'Created At', ) - columns_long = columns + ( - 'Availability Zone', - 'Volume', - 'Container', - ) + columns_long = (*columns, 'Availability Zone', 'Volume', 'Container') def setUp(self): super().setUp() diff --git a/openstackclient/tests/unit/volume/v2/test_volume_snapshot.py b/openstackclient/tests/unit/volume/v2/test_volume_snapshot.py index 0df379bb2..c1d88c453 100644 --- a/openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +++ b/openstackclient/tests/unit/volume/v2/test_volume_snapshot.py @@ -297,7 +297,8 @@ def setUp(self): self.project_mock.get.return_value = self.project self.columns = ("ID", "Name", "Description", "Status", "Size") - self.columns_long = self.columns + ( + self.columns_long = ( + *self.columns, "Created At", "Volume", "Properties", diff --git a/openstackclient/tests/unit/volume/v2/test_volume_type.py b/openstackclient/tests/unit/volume/v2/test_volume_type.py index 6f50ff2ef..b4df3e63c 100644 --- a/openstackclient/tests/unit/volume/v2/test_volume_type.py +++ b/openstackclient/tests/unit/volume/v2/test_volume_type.py @@ -332,7 +332,7 @@ class TestTypeList(TestType): "Name", "Is Public", ] - columns_long = columns + ["Description"] + columns_long = [*columns, "Description"] data_with_default_type = [(volume_types[0].id, volume_types[0].name, True)] data = [] for t in volume_types: @@ -436,9 +436,7 @@ def test_type_list_with_encryption(self): 'key_size': None, 'control_location': 'front-end', } - encryption_columns = self.columns + [ - "Encryption", - ] + encryption_columns = [*self.columns, "Encryption"] encryption_data = [] encryption_data.append( ( diff --git a/openstackclient/tests/unit/volume/v3/test_volume_backup.py b/openstackclient/tests/unit/volume/v3/test_volume_backup.py index 86bde785f..480912796 100644 --- a/openstackclient/tests/unit/volume/v3/test_volume_backup.py +++ b/openstackclient/tests/unit/volume/v3/test_volume_backup.py @@ -319,11 +319,7 @@ class TestBackupList(volume_fakes.TestVolume): 'Incremental', 'Created At', ) - columns_long = columns + ( - 'Availability Zone', - 'Volume', - 'Container', - ) + columns_long = (*columns, 'Availability Zone', 'Volume', 'Container') def setUp(self): super().setUp() diff --git a/openstackclient/tests/unit/volume/v3/test_volume_snapshot.py b/openstackclient/tests/unit/volume/v3/test_volume_snapshot.py index 85613603d..59fc42baa 100644 --- a/openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +++ b/openstackclient/tests/unit/volume/v3/test_volume_snapshot.py @@ -340,7 +340,8 @@ def setUp(self): self.project_mock.get.return_value = self.project self.columns = ("ID", "Name", "Description", "Status", "Size") - self.columns_long = self.columns + ( + self.columns_long = ( + *self.columns, "Created At", "Volume", "Properties", diff --git a/openstackclient/tests/unit/volume/v3/test_volume_type.py b/openstackclient/tests/unit/volume/v3/test_volume_type.py index 828f8b090..eedd07e5b 100644 --- a/openstackclient/tests/unit/volume/v3/test_volume_type.py +++ b/openstackclient/tests/unit/volume/v3/test_volume_type.py @@ -331,7 +331,7 @@ class TestTypeList(TestType): "Name", "Is Public", ] - columns_long = columns + ["Description", "Properties"] + columns_long = [*columns, "Description", "Properties"] data_with_default_type = [(volume_types[0].id, volume_types[0].name, True)] data = [] for t in volume_types: @@ -509,9 +509,7 @@ def test_type_list_with_encryption(self): 'key_size': None, 'control_location': 'front-end', } - encryption_columns = self.columns + [ - "Encryption", - ] + encryption_columns = [*self.columns, "Encryption"] encryption_data = [] encryption_data.append( ( diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py index ef4ff05ff..095a90223 100644 --- a/openstackclient/volume/v2/volume.py +++ b/openstackclient/volume/v2/volume.py @@ -555,7 +555,7 @@ def take_action(self, parsed_args): compute_client = self.app.client_manager.compute for s in compute_client.servers(): server_cache[s.id] = s - except sdk_exceptions.SDKException: # noqa: S110 + except sdk_exceptions.SDKException: # Just forget it if there's any trouble pass AttachmentsColumnWithCache = functools.partial( diff --git a/openstackclient/volume/v3/volume.py b/openstackclient/volume/v3/volume.py index 428460006..1c5b03e46 100644 --- a/openstackclient/volume/v3/volume.py +++ b/openstackclient/volume/v3/volume.py @@ -706,7 +706,7 @@ def take_action(self, parsed_args): compute_client = self.app.client_manager.compute for s in compute_client.servers(): server_cache[s.id] = s - except sdk_exceptions.SDKException: # noqa: S110 + except sdk_exceptions.SDKException: # Just forget it if there's any trouble pass AttachmentsColumnWithCache = functools.partial( diff --git a/pyproject.toml b/pyproject.toml index b23877ed5..a938144be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -758,7 +758,14 @@ quote-style = "preserve" docstring-code-format = true [tool.ruff.lint] -select = ["E4", "E5", "E7", "E9", "F", "G", "S", "UP"] +select = ["E4", "E5", "E7", "E9", "F", "G", "RUF", "S", "UP"] +ignore = [ + # the following are ignored because they don't provide enough value for the + # changes required + "RUF012", # Mutable default value for class attribute +] +# don't remove hacking (H) or openstackclient (O) checks +external = ["H", "O"] [tool.ruff.lint.per-file-ignores] "openstackclient/tests/*" = ["E501", "S"]