diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d1748493..31d9d64c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,3 +23,8 @@ repos: hooks: - id: hacking additional_dependencies: [] + - repo: https://github.com/asottile/pyupgrade + rev: v3.18.0 + hooks: + - id: pyupgrade + args: [--py3-only] diff --git a/doc/source/conf.py b/doc/source/conf.py index 1a6afbc4..75d5cd80 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at diff --git a/doc/source/ext/gen_ref.py b/doc/source/ext/gen_ref.py index a5071887..3886aba0 100644 --- a/doc/source/ext/gen_ref.py +++ b/doc/source/ext/gen_ref.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at @@ -25,7 +24,7 @@ def gen_ref(ver, title, names): refdir = os.path.join(BASE_DIR, "ref") pkg = "heatclient" if ver: - pkg = "%s.%s" % (pkg, ver) + pkg = "{}.{}".format(pkg, ver) refdir = os.path.join(refdir, ver) if not os.path.exists(refdir): os.makedirs(refdir) diff --git a/heatclient/common/base.py b/heatclient/common/base.py index 550a77a6..2ec763e5 100644 --- a/heatclient/common/base.py +++ b/heatclient/common/base.py @@ -48,7 +48,7 @@ def getid(obj): # TODO(aababilov): call run_hooks() in HookableMixin's child classes -class HookableMixin(object): +class HookableMixin: """Mixin so classes can register and run hooks.""" _hooks_map = {} @@ -92,7 +92,7 @@ class BaseManager(HookableMixin): :param client: instance of BaseClient descendant for HTTP requests """ - super(BaseManager, self).__init__() + super().__init__() self.client = client def _list(self, url, response_key=None, obj_class=None, json=None): @@ -279,13 +279,12 @@ class CrudManager(BaseManager): :param base_url: if provided, the generated URL will be appended to it """ url = base_url if base_url is not None else '' - - url += '/%s' % self.collection_key + url = '/'.join([url, self.collection_key]) # do we have a specific entity? - entity_id = kwargs.get('%s_id' % self.key) + entity_id = kwargs.get('{}_id'.format(self.key)) if entity_id is not None: - url += '/%s' % entity_id + url = '/'.join([url, entity_id]) return url @@ -297,7 +296,7 @@ class CrudManager(BaseManager): else: if isinstance(ref, Resource): kwargs.pop(key) - kwargs['%s_id' % key] = getid(ref) + kwargs['{}_id'.firmat(key)] = getid(ref) return kwargs def create(self, **kwargs): @@ -323,12 +322,13 @@ class CrudManager(BaseManager): :param base_url: if provided, the generated URL will be appended to it """ kwargs = self._filter_kwargs(kwargs) + query = '?{}'.format(parse.urlencode(kwargs)) if kwargs else '' return self._list( - '%(base_url)s%(query)s' % { - 'base_url': self.build_url(base_url=base_url, **kwargs), - 'query': '?%s' % parse.urlencode(kwargs) if kwargs else '', - }, + '{base_url}{query}'.format( + base_url=self.build_url(base_url=base_url, **kwargs), + query=query, + ), self.collection_key) def put(self, base_url=None, **kwargs): @@ -343,7 +343,7 @@ class CrudManager(BaseManager): def update(self, **kwargs): kwargs = self._filter_kwargs(kwargs) params = kwargs.copy() - params.pop('%s_id' % self.key) + params.pop('{}_id'.format(self.key)) return self._patch( self.build_url(**kwargs), @@ -362,12 +362,13 @@ class CrudManager(BaseManager): :param base_url: if provided, the generated URL will be appended to it """ kwargs = self._filter_kwargs(kwargs) + query = '?{}'.format(parse.urlencode(kwargs)) if kwargs else '' rl = self._list( - '%(base_url)s%(query)s' % { - 'base_url': self.build_url(base_url=base_url, **kwargs), - 'query': '?%s' % parse.urlencode(kwargs) if kwargs else '', - }, + '{base_url}{query}'.format( + base_url=self.build_url(base_url=base_url, **kwargs), + query=query, + ), self.collection_key) num = len(rl) @@ -390,7 +391,7 @@ class Extension(HookableMixin): manager_class = None def __init__(self, name, module): - super(Extension, self).__init__() + super().__init__() self.name = name self.module = module self._parse_extension_module() @@ -408,10 +409,10 @@ class Extension(HookableMixin): pass def __repr__(self): - return "" % self.name + return "".format(self.name) -class Resource(object): +class Resource: """Base class for OpenStack resources (tenant, user, etc.). This is pretty much just a bag for attributes. @@ -435,9 +436,9 @@ class Resource(object): reprkeys = sorted(k for k in self.__dict__ if k[0] != '_' and k != 'manager') - info = ", ".join("%s=%s" % (k, getattr(self, k)) for k in reprkeys) + info = ", ".join("{}={}".format(k, getattr(self, k)) for k in reprkeys) class_name = reflection.get_class_name(self, fully_qualified=False) - return "<%s %s>" % (class_name, info) + return "<{} {}>".format(class_name, info) @property def human_id(self): diff --git a/heatclient/common/deployment_utils.py b/heatclient/common/deployment_utils.py index 80a9f7de..05e813d9 100644 --- a/heatclient/common/deployment_utils.py +++ b/heatclient/common/deployment_utils.py @@ -93,8 +93,8 @@ def build_derived_config_params(action, source, name, input_values, def create_temp_url(swift_client, name, timeout, container=None): - container = container or '%(name)s-%(uuid)s' % { - 'name': name, 'uuid': uuid.uuid4()} + container = container or '{name}-{uuid}'.format( + name=name, uuid=uuid.uuid4()) object_name = str(uuid.uuid4()) swift_client.put_container(container) @@ -105,12 +105,12 @@ def create_temp_url(swift_client, name, timeout, container=None): key = swift_client.head_account()[key_header] project_path = swift_client.url.split('/')[-1] - path = '/v1/%s/%s/%s' % (project_path, container, object_name) + path = '/v1/{}/{}/{}'.format(project_path, container, object_name) timeout_secs = timeout * 60 tempurl = swiftclient_utils.generate_temp_url(path, timeout_secs, key, 'PUT') sw_url = urlparse.urlparse(swift_client.url) - put_url = '%s://%s%s' % (sw_url.scheme, sw_url.netloc, tempurl) + put_url = '{}://{}{}'.format(sw_url.scheme, sw_url.netloc, tempurl) swift_client.put_object(container, object_name, '') return put_url diff --git a/heatclient/common/event_utils.py b/heatclient/common/event_utils.py index 93d424cc..24b636d6 100644 --- a/heatclient/common/event_utils.py +++ b/heatclient/common/event_utils.py @@ -251,8 +251,8 @@ def wait_for_events(ws, stack_name, out=None): event = events_mod.Event(None, data['payload'], True) # Keep compatibility with the HTTP API event.event_time = data['timestamp'] - event.resource_status = '%s_%s' % (event.resource_action, - event.resource_status) + event.resource_status = '{}_{}'.format(event.resource_action, + event.resource_status) events_log = utils.event_log_formatter([event], event_log_context) out.write(events_log) out.write('\n') @@ -261,4 +261,4 @@ def wait_for_events(ws, stack_name, out=None): if stack_status in ('COMPLETE', 'FAILED'): msg = msg_template % dict( name=stack_name, status=event.resource_status) - return '%s_%s' % (event.resource_action, stack_status), msg + return '{}_{}'.format(event.resource_action, stack_status), msg diff --git a/heatclient/common/format_utils.py b/heatclient/common/format_utils.py index 598ae9eb..db43a98f 100644 --- a/heatclient/common/format_utils.py +++ b/heatclient/common/format_utils.py @@ -90,6 +90,6 @@ def print_software_deployment_output(data, name, out=sys.stdout, long=False): truncate=not long, truncate_prefix='...', truncate_postfix='(truncated, view all with --long)') - out.write(' %s: |\n%s\n' % (name, output)) + out.write(' {}: |\n{}\n'.format(name, output)) else: - out.write(' %s: %s\n' % (name, data.get(name))) + out.write(' {}: {}\n'.format(name, data.get(name))) diff --git a/heatclient/common/http.py b/heatclient/common/http.py index f71ca668..af3d7d9e 100644 --- a/heatclient/common/http.py +++ b/heatclient/common/http.py @@ -68,7 +68,7 @@ def get_system_ca_file(): LOG.warning("System ca file could not be found.") -class HTTPClient(object): +class HTTPClient: def __init__(self, endpoint, **kwargs): self.endpoint = endpoint @@ -146,7 +146,7 @@ class HTTPClient(object): def log_http_response(resp): status = (resp.raw.version / 10.0, resp.status_code, resp.reason) dump = ['\nHTTP/%.1f %s %s' % status] - dump.extend(['%s: %s' % (k, v) for k, v in resp.headers.items()]) + dump.extend(['{}: {}'.format(k, v) for k, v in resp.headers.items()]) dump.append('') if resp.content: content = resp.content @@ -216,7 +216,7 @@ class HTTPClient(object): message = (_("Error finding address for %(url)s: %(e)s") % {'url': self.endpoint_url + url, 'e': e}) raise exc.InvalidEndpoint(message=message) - except (socket.error, socket.timeout) as e: + except (OSError, socket.timeout) as e: endpoint = self.endpoint message = (_("Error communicating with %(endpoint)s %(e)s") % {'endpoint': endpoint, 'e': e}) @@ -313,7 +313,7 @@ class SessionClient(adapter.LegacyJsonAdapter): if 'data' in kwargs: kwargs['data'] = jsonutils.dumps(kwargs['data']) - resp, body = super(SessionClient, self).request( + resp, body = super().request( url, method, raise_exc=False, **kwargs) diff --git a/heatclient/common/resource_formatter.py b/heatclient/common/resource_formatter.py index 0d56d915..0e49a548 100644 --- a/heatclient/common/resource_formatter.py +++ b/heatclient/common/resource_formatter.py @@ -17,7 +17,7 @@ import hashlib from cliff.formatters import base -class ResourceDotInfo(object): +class ResourceDotInfo: def __init__(self, res): self.resource = res @@ -34,7 +34,7 @@ class ResourceDotInfo(object): if not prefix: prefix = 'r' hash_object = hashlib.sha256(url.encode('utf-8')) - return '%s_%s' % (prefix, hash_object.hexdigest()[:20]) + return '{}_{}'.format(prefix, hash_object.hexdigest()[:20]) class ResourceDotFormatter(base.ListFormatter): @@ -46,7 +46,7 @@ class ResourceDotFormatter(base.ListFormatter): writer.write() -class ResourceDotWriter(object): +class ResourceDotWriter: def __init__(self, data, stdout): self.resources_by_stack = collections.defaultdict( diff --git a/heatclient/common/utils.py b/heatclient/common/utils.py index 61c77830..59403fe3 100644 --- a/heatclient/common/utils.py +++ b/heatclient/common/utils.py @@ -128,7 +128,7 @@ def print_list(objs, fields, formatters=None, sortby_index=0, def link_formatter(links): def format_link(link): if 'rel' in link: - return "%s (%s)" % (link.get('href', ''), link.get('rel', '')) + return "{} ({})".format(link.get('href', ''), link.get('rel', '')) else: return "%s" % (link.get('href', '')) return '\n'.join(format_link(link) for link in links or []) @@ -174,7 +174,7 @@ def print_dict(d, formatters=None): print(pt.get_string(sortby='Property')) -class EventLogContext(object): +class EventLogContext: def __init__(self): # key is a stack id or the name of the nested stack, value is a tuple diff --git a/heatclient/exc.py b/heatclient/exc.py index e3ac2f97..5cbd915b 100644 --- a/heatclient/exc.py +++ b/heatclient/exc.py @@ -46,7 +46,7 @@ class HTTPException(BaseException): code = 'N/A' def __init__(self, message=None, code=None): - super(HTTPException, self).__init__(message) + super().__init__(message) try: self.error = jsonutils.loads(message) if 'error' not in self.error: diff --git a/heatclient/osc/v1/build_info.py b/heatclient/osc/v1/build_info.py index 1ab39dfb..6428fe42 100644 --- a/heatclient/osc/v1/build_info.py +++ b/heatclient/osc/v1/build_info.py @@ -27,7 +27,7 @@ class BuildInfo(command.ShowOne): log = logging.getLogger(__name__ + ".BuildInfo") def get_parser(self, prog_name): - parser = super(BuildInfo, self).get_parser(prog_name) + parser = super().get_parser(prog_name) return parser def take_action(self, parsed_args): diff --git a/heatclient/osc/v1/event.py b/heatclient/osc/v1/event.py index 017803a4..ea5ff16d 100644 --- a/heatclient/osc/v1/event.py +++ b/heatclient/osc/v1/event.py @@ -32,7 +32,7 @@ class ShowEvent(command.ShowOne): log = logging.getLogger(__name__ + '.ShowEvent') def get_parser(self, prog_name): - parser = super(ShowEvent, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', @@ -96,7 +96,7 @@ class ListEvent(command.Lister): return 'heatclient.event.formatter.list' def get_parser(self, prog_name): - parser = super(ListEvent, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', diff --git a/heatclient/osc/v1/resource.py b/heatclient/osc/v1/resource.py index a30bae21..b2d893f0 100644 --- a/heatclient/osc/v1/resource.py +++ b/heatclient/osc/v1/resource.py @@ -33,7 +33,7 @@ class ResourceShow(command.ShowOne): log = logging.getLogger(__name__ + '.ResourceShowStack') def get_parser(self, prog_name): - parser = super(ResourceShow, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', @@ -80,7 +80,7 @@ class ResourceList(command.Lister): return 'heatclient.resource.formatter.list' def get_parser(self, prog_name): - parser = super(ResourceList, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', @@ -153,7 +153,7 @@ class ResourceMetadata(format_utils.JsonFormat): log = logging.getLogger(__name__ + ".ResourceMetadata") def get_parser(self, prog_name): - parser = super(ResourceMetadata, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', @@ -194,7 +194,7 @@ class ResourceSignal(command.Command): log = logging.getLogger(__name__ + ".ResourceSignal") def get_parser(self, prog_name): - parser = super(ResourceSignal, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', @@ -261,7 +261,7 @@ class ResourceMarkUnhealthy(command.Command): log = logging.getLogger(__name__ + ".ResourceMarkUnhealthy") def get_parser(self, prog_name): - parser = super(ResourceMarkUnhealthy, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', diff --git a/heatclient/osc/v1/resource_type.py b/heatclient/osc/v1/resource_type.py index 128b6dcd..6e5cf634 100644 --- a/heatclient/osc/v1/resource_type.py +++ b/heatclient/osc/v1/resource_type.py @@ -30,8 +30,7 @@ class ResourceTypeShow(format_utils.YamlFormat): log = logging.getLogger(__name__ + ".ResourceTypeShow") def get_parser(self, prog_name): - parser = super(ResourceTypeShow, - self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'resource_type', metavar='', @@ -90,8 +89,7 @@ class ResourceTypeList(command.Lister): log = logging.getLogger(__name__ + '.ResourceTypeList') def get_parser(self, prog_name): - parser = super(ResourceTypeList, - self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( '--filter', dest='filter', diff --git a/heatclient/osc/v1/service.py b/heatclient/osc/v1/service.py index 09dec4d1..3ca042ca 100644 --- a/heatclient/osc/v1/service.py +++ b/heatclient/osc/v1/service.py @@ -25,7 +25,7 @@ class ListService(command.Lister): log = logging.getLogger(__name__ + ".ListService") def get_parser(self, prog_name): - parser = super(ListService, self).get_parser(prog_name) + parser = super().get_parser(prog_name) return parser def take_action(self, parsed_args): diff --git a/heatclient/osc/v1/snapshot.py b/heatclient/osc/v1/snapshot.py index 80882851..1ff1384a 100644 --- a/heatclient/osc/v1/snapshot.py +++ b/heatclient/osc/v1/snapshot.py @@ -31,7 +31,7 @@ class ListSnapshot(command.Lister): log = logging.getLogger(__name__ + ".ListSnapshot") def get_parser(self, prog_name): - parser = super(ListSnapshot, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', @@ -66,7 +66,7 @@ class ShowSnapshot(format_utils.YamlFormat): log = logging.getLogger(__name__ + ".ShowSnapshot") def get_parser(self, prog_name): - parser = super(ShowSnapshot, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', @@ -105,7 +105,7 @@ class RestoreSnapshot(command.Command): log = logging.getLogger(__name__ + ".RestoreSnapshot") def get_parser(self, prog_name): - parser = super(RestoreSnapshot, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', @@ -141,7 +141,7 @@ class CreateSnapshot(command.ShowOne): log = logging.getLogger(__name__ + ".CreateSnapshot") def get_parser(self, prog_name): - parser = super(CreateSnapshot, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', @@ -181,7 +181,7 @@ class DeleteSnapshot(command.Command): log = logging.getLogger(__name__ + ".DeleteSnapshot") def get_parser(self, prog_name): - parser = super(DeleteSnapshot, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'stack', metavar='', diff --git a/heatclient/osc/v1/software_config.py b/heatclient/osc/v1/software_config.py index dcfa5d66..89378310 100644 --- a/heatclient/osc/v1/software_config.py +++ b/heatclient/osc/v1/software_config.py @@ -34,7 +34,7 @@ class DeleteConfig(command.Command): log = logging.getLogger(__name__ + ".DeleteConfig") def get_parser(self, prog_name): - parser = super(DeleteConfig, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'config', metavar='', @@ -76,7 +76,7 @@ class ListConfig(command.Lister): log = logging.getLogger(__name__ + ".ListConfig") def get_parser(self, prog_name): - parser = super(ListConfig, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( '--limit', metavar='', @@ -114,7 +114,7 @@ class CreateConfig(format_utils.JsonFormat): log = logging.getLogger(__name__ + ".CreateConfig") def get_parser(self, prog_name): - parser = super(CreateConfig, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'name', metavar='', @@ -192,7 +192,7 @@ class ShowConfig(format_utils.YamlFormat): log = logging.getLogger(__name__ + ".ShowConfig") def get_parser(self, prog_name): - parser = super(ShowConfig, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'config', metavar='', diff --git a/heatclient/osc/v1/software_deployment.py b/heatclient/osc/v1/software_deployment.py index 825d8fb7..6c5cfd92 100644 --- a/heatclient/osc/v1/software_deployment.py +++ b/heatclient/osc/v1/software_deployment.py @@ -33,7 +33,7 @@ class CreateDeployment(format_utils.YamlFormat): log = logging.getLogger(__name__ + '.CreateDeployment') def get_parser(self, prog_name): - parser = super(CreateDeployment, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'name', metavar='', @@ -136,7 +136,7 @@ class DeleteDeployment(command.Command): log = logging.getLogger(__name__ + '.DeleteDeployment') def get_parser(self, prog_name): - parser = super(DeleteDeployment, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'deployment', metavar='', @@ -185,7 +185,7 @@ class ListDeployment(command.Lister): log = logging.getLogger(__name__ + '.ListDeployment') def get_parser(self, prog_name): - parser = super(ListDeployment, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( '--server', metavar='', @@ -225,7 +225,7 @@ class ShowDeployment(command.ShowOne): log = logging.getLogger(__name__ + ".ShowSoftwareDeployment") def get_parser(self, prog_name): - parser = super(ShowDeployment, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'deployment', metavar='', @@ -272,7 +272,7 @@ class ShowMetadataDeployment(command.Command): log = logging.getLogger(__name__ + '.ShowMetadataDeployment') def get_parser(self, prog_name): - parser = super(ShowMetadataDeployment, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'server', metavar='', @@ -294,7 +294,7 @@ class ShowOutputDeployment(command.Command): log = logging.getLogger(__name__ + '.ShowOutputDeployment') def get_parser(self, prog_name): - parser = super(ShowOutputDeployment, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( 'deployment', metavar='', diff --git a/heatclient/osc/v1/stack.py b/heatclient/osc/v1/stack.py index e1b14a83..1d3ec7c7 100644 --- a/heatclient/osc/v1/stack.py +++ b/heatclient/osc/v1/stack.py @@ -41,7 +41,7 @@ class CreateStack(command.ShowOne): log = logging.getLogger(__name__ + '.CreateStack') def get_parser(self, prog_name): - parser = super(CreateStack, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( '-e', '--environment', metavar='', @@ -219,7 +219,7 @@ class UpdateStack(command.ShowOne): log = logging.getLogger(__name__ + '.UpdateStack') def get_parser(self, prog_name): - parser = super(UpdateStack, self).get_parser(prog_name) + parser = super().get_parser(prog_name) parser.add_argument( '-t', '--template', metavar='