From 6df3bcd3ed2b0d1c76ab4b6073d76cb4574cf21a Mon Sep 17 00:00:00 2001 From: jacky06 Date: Mon, 4 May 2020 15:48:24 +0800 Subject: [PATCH] Remove six We don't need this in a Python 3-only world. Change-Id: I468a65eb1a950467671fff36a2f27387b81a6dc8 --- lower-constraints.txt | 1 - zunclient/common/apiclient/auth.py | 4 +--- zunclient/common/apiclient/exceptions.py | 4 +--- zunclient/common/base.py | 2 +- zunclient/common/cliutils.py | 22 ++++++------------- zunclient/common/httpclient.py | 19 ++++++++-------- zunclient/common/template_utils.py | 9 ++++---- zunclient/common/utils.py | 9 ++++---- .../common/websocketclient/websocketclient.py | 5 ++--- zunclient/osc/v1/registries.py | 7 +++--- zunclient/shell.py | 3 +-- zunclient/tests/functional/base.py | 9 ++------ .../tests/unit/common/test_httpclient.py | 13 ++++++----- zunclient/tests/unit/common/test_utils.py | 12 +++++----- zunclient/tests/unit/test_shell.py | 6 ++--- zunclient/tests/unit/utils.py | 8 +++---- zunclient/tests/unit/v1/test_containers.py | 3 ++- zunclient/v1/containers.py | 2 +- zunclient/v1/services.py | 2 +- zunclient/v1/versions.py | 2 +- 20 files changed, 61 insertions(+), 81 deletions(-) diff --git a/lower-constraints.txt b/lower-constraints.txt index b5616916..3ede2c8e 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -103,7 +103,6 @@ restructuredtext-lint==1.1.1 rfc3986==1.1.0 Routes==2.3.1 simplejson==3.13.2 -six==1.11.0 smmap==0.9.0 statsd==3.2.1 stestr==2.0.0 diff --git a/zunclient/common/apiclient/auth.py b/zunclient/common/apiclient/auth.py index af6d0b1f..2e4a2689 100644 --- a/zunclient/common/apiclient/auth.py +++ b/zunclient/common/apiclient/auth.py @@ -20,7 +20,6 @@ import abc import argparse import os -import six from zunclient.common.apiclient import exceptions @@ -51,8 +50,7 @@ def load_plugin(auth_system): return plugin_class(auth_system=auth_system) -@six.add_metaclass(abc.ABCMeta) -class BaseAuthPlugin(object): +class BaseAuthPlugin(object, metaclass=abc.ABCMeta): """Base class for authentication plugins. An authentication plugin needs to override at least the authenticate diff --git a/zunclient/common/apiclient/exceptions.py b/zunclient/common/apiclient/exceptions.py index 9254e8ef..d5ae0148 100644 --- a/zunclient/common/apiclient/exceptions.py +++ b/zunclient/common/apiclient/exceptions.py @@ -23,8 +23,6 @@ Exception definitions. import inspect import sys -import six - from zunclient.i18n import _ @@ -454,7 +452,7 @@ def from_response(response, method, url): kwargs["message"] = (error.get("message") or error.get("faultstring")) kwargs["details"] = (error.get("details") or - six.text_type(body)) + str(body)) elif content_type.startswith("text/"): kwargs["details"] = getattr(response, 'text', '') diff --git a/zunclient/common/base.py b/zunclient/common/base.py index 368559d9..3231b7b2 100644 --- a/zunclient/common/base.py +++ b/zunclient/common/base.py @@ -20,7 +20,7 @@ Base utilities to build API operation managers and objects on top of. import copy -import six.moves.urllib.parse as urlparse +from urllib import parse as urlparse from zunclient.common.apiclient import base diff --git a/zunclient/common/cliutils.py b/zunclient/common/cliutils.py index 6430dac8..399cb228 100644 --- a/zunclient/common/cliutils.py +++ b/zunclient/common/cliutils.py @@ -29,8 +29,6 @@ import decorator from oslo_utils import encodeutils from oslo_utils import strutils import prettytable -import six -from six import moves from zunclient.i18n import _ @@ -209,10 +207,7 @@ def print_list(objs, fields, formatters=None, sortby_index=0, row.append(data) pt.add_row(row) - if six.PY3: - print(encodeutils.safe_encode(pt.get_string(**kwargs)).decode()) - else: - print(encodeutils.safe_encode(pt.get_string(**kwargs))) + print(encodeutils.safe_encode(pt.get_string(**kwargs)).decode()) def keys_and_vals_to_strs(dictionary): @@ -223,7 +218,7 @@ def keys_and_vals_to_strs(dictionary): def to_str(k_or_v): if isinstance(k_or_v, dict): return keys_and_vals_to_strs(k_or_v) - elif isinstance(k_or_v, six.text_type): + elif isinstance(k_or_v, str): return str(k_or_v) else: return k_or_v @@ -245,14 +240,14 @@ def print_dict(dct, dict_property="Property", wrap=0, value_fields=None): for k, v in dct.items(): # convert dict to str to check length if isinstance(v, dict) and not value_fields: - v = six.text_type(keys_and_vals_to_strs(v)) + v = str(keys_and_vals_to_strs(v)) if wrap > 0: - v = textwrap.fill(six.text_type(v), wrap) + v = textwrap.fill(str(v), wrap) elif wrap < 0: raise ValueError(_("Wrap argument should be a positive integer")) # if value has a newline, add in multiple rows # e.g. fault with stacktrace - if v and isinstance(v, six.string_types) and r'\n' in v: + if v and isinstance(v, str) and r'\n' in v: lines = v.strip().split(r'\n') col1 = k for line in lines: @@ -267,10 +262,7 @@ def print_dict(dct, dict_property="Property", wrap=0, value_fields=None): else: pt.add_row([k, v]) - if six.PY3: - print(encodeutils.safe_encode(pt.get_string()).decode()) - else: - print(encodeutils.safe_encode(pt.get_string())) + print(encodeutils.safe_encode(pt.get_string()).decode()) def get_password(max_password_prompts=3): @@ -280,7 +272,7 @@ def get_password(max_password_prompts=3): if hasattr(sys.stdin, "isatty") and sys.stdin.isatty(): # Check for Ctrl-D try: - for __ in moves.range(max_password_prompts): + for __ in range(max_password_prompts): pw1 = getpass.getpass("OS Password: ") if verify: pw2 = getpass.getpass("Please verify: ") diff --git a/zunclient/common/httpclient.py b/zunclient/common/httpclient.py index 38bc54cb..fb854bcd 100644 --- a/zunclient/common/httpclient.py +++ b/zunclient/common/httpclient.py @@ -15,16 +15,17 @@ # under the License. import copy +from http import client as http_client +import io import os from oslo_log import log as logging from oslo_serialization import jsonutils import socket import ssl +import urllib.parse as urlparse from keystoneauth1 import adapter from oslo_utils import importutils -import six -import six.moves.urllib.parse as urlparse from zunclient import api_versions from zunclient import exceptions @@ -93,7 +94,7 @@ class HTTPClient(object): _kwargs['key_file'] = kwargs.get('key_file', None) _kwargs['insecure'] = kwargs.get('insecure', False) elif parts.scheme == 'http': - _class = six.moves.http_client.HTTPConnection + _class = http_client.HTTPConnection else: msg = 'Unsupported scheme: %s' % parts.scheme raise exceptions.EndpointException(msg) @@ -105,7 +106,7 @@ class HTTPClient(object): try: return _class(*self.connection_params[1][0:2], **self.connection_params[2]) - except six.moves.http_client.InvalidURL: + except http_client.InvalidURL: raise exceptions.EndpointException() def log_curl_request(self, method, url, kwargs): @@ -195,7 +196,7 @@ class HTTPClient(object): ] body_str = ''.join(body_list) self.log_http_response(resp, body_str) - body_iter = six.StringIO(body_str) + body_iter = io.StringIO(body_str) else: self.log_http_response(resp) @@ -245,7 +246,7 @@ class HTTPClient(object): return self._http_request(url, method, **kwargs) -class VerifiedHTTPSConnection(six.moves.http_client.HTTPSConnection): +class VerifiedHTTPSConnection(http_client.HTTPSConnection): """httplib-compatibile connection using client-side SSL authentication :see http://code.activestate.com/recipes/ @@ -254,9 +255,9 @@ class VerifiedHTTPSConnection(six.moves.http_client.HTTPSConnection): def __init__(self, host, port, key_file=None, cert_file=None, ca_file=None, timeout=None, insecure=False): - six.moves.http_client.HTTPSConnection.__init__(self, host, port, - key_file=key_file, - cert_file=cert_file) + http_client.HTTPSConnection.__init__(self, host, port, + key_file=key_file, + cert_file=cert_file) self.key_file = key_file self.cert_file = cert_file if ca_file is not None: diff --git a/zunclient/common/template_utils.py b/zunclient/common/template_utils.py index 06952bc6..4bb288fe 100644 --- a/zunclient/common/template_utils.py +++ b/zunclient/common/template_utils.py @@ -13,9 +13,8 @@ # under the License. from oslo_serialization import jsonutils -import six -from six.moves.urllib import parse -from six.moves.urllib import request +from urllib import parse +from urllib import request from zunclient.common import template_format from zunclient.common import utils @@ -43,7 +42,7 @@ def get_template_contents(template_file=None, template_url=None, template_url) try: - if isinstance(tpl, six.binary_type): + if isinstance(tpl, bytes): tpl = tpl.decode('utf-8') template = template_format.parse(tpl) except ValueError as e: @@ -56,7 +55,7 @@ def get_template_contents(template_file=None, template_url=None, def is_template(file_content): try: - if isinstance(file_content, six.binary_type): + if isinstance(file_content, bytes): file_content = file_content.decode('utf-8') template_format.parse(file_content) except (ValueError, TypeError): diff --git a/zunclient/common/utils.py b/zunclient/common/utils.py index 1ee1de51..263b6737 100644 --- a/zunclient/common/utils.py +++ b/zunclient/common/utils.py @@ -22,9 +22,8 @@ import shlex from oslo_serialization import jsonutils from oslo_utils import netutils -import six -from six.moves.urllib import parse -from six.moves.urllib import request +from urllib import parse +from urllib import request from zunclient.common.apiclient import exceptions as apiexec from zunclient.common import cliutils as utils from zunclient import exceptions as exc @@ -204,7 +203,7 @@ def list_availability_zones(zones): def parse_command(command): output = [] if command: - if isinstance(command, six.string_types): + if isinstance(command, str): command = [command] for c in command: c = '"' + c + '"' @@ -391,7 +390,7 @@ def list_container_networks(networks): def encode_file_data(data): - if six.PY3 and isinstance(data, str): + if isinstance(data, str): data = data.encode('utf-8') return base64.b64encode(data).decode('utf-8') diff --git a/zunclient/common/websocketclient/websocketclient.py b/zunclient/common/websocketclient/websocketclient.py index e37f2861..c2459e62 100644 --- a/zunclient/common/websocketclient/websocketclient.py +++ b/zunclient/common/websocketclient/websocketclient.py @@ -22,14 +22,13 @@ import os from oslo_log import log as logging import select import signal -import six -import six.moves.urllib.parse as urlparse import socket import struct import sys import termios import time import tty +from urllib import parse as urlparse import websocket from zunclient.common.apiclient import exceptions as acexceptions @@ -110,7 +109,7 @@ class BaseClient(object): self.handle_stdin(event) except select.error as e: # POSIX signals interrupt select() - no = e.errno if six.PY3 else e[0] + no = e.errno if no == errno.EINTR: continue else: diff --git a/zunclient/osc/v1/registries.py b/zunclient/osc/v1/registries.py index f6269750..18efde92 100644 --- a/zunclient/osc/v1/registries.py +++ b/zunclient/osc/v1/registries.py @@ -13,7 +13,6 @@ from osc_lib.command import command from osc_lib import utils from oslo_log import log as logging -import six from zunclient.common import utils as zun_utils from zunclient import exceptions as exc @@ -60,7 +59,7 @@ class CreateRegistry(command.ShowOne): opts['password'] = parsed_args.password opts = zun_utils.remove_null_parms(**opts) registry = client.registries.create(**opts) - return zip(*sorted(six.iteritems(registry._info['registry']))) + return zip(*sorted(registry._info['registry'].items())) class ShowRegistry(command.ShowOne): @@ -83,7 +82,7 @@ class ShowRegistry(command.ShowOne): opts = zun_utils.remove_null_parms(**opts) registry = client.registries.get(**opts) - return zip(*sorted(six.iteritems(registry._info['registry']))) + return zip(*sorted(registry._info['registry'].items())) class ListRegistry(command.Lister): @@ -229,4 +228,4 @@ class UpdateRegistry(command.ShowOne): if not opts: raise exc.CommandError("You must update at least one property") registry = client.registries.update(registry, **opts) - return zip(*sorted(six.iteritems(registry._info['registry']))) + return zip(*sorted(registry._info['registry'].items())) diff --git a/zunclient/shell.py b/zunclient/shell.py index 8d45bea6..70f3c1f0 100644 --- a/zunclient/shell.py +++ b/zunclient/shell.py @@ -32,7 +32,6 @@ import sys from oslo_utils import encodeutils from oslo_utils import importutils from oslo_utils import strutils -import six from zunclient import api_versions from zunclient import client as base_client @@ -766,7 +765,7 @@ def main(): map(encodeutils.safe_decode, sys.argv[1:])) except Exception as e: logger.debug(e, exc_info=1) - print("ERROR: %s" % encodeutils.safe_encode(six.text_type(e)), + print("ERROR: %s" % encodeutils.safe_encode(str(e)), file=sys.stderr) sys.exit(1) diff --git a/zunclient/tests/functional/base.py b/zunclient/tests/functional/base.py index 4b5caa1d..00579af7 100644 --- a/zunclient/tests/functional/base.py +++ b/zunclient/tests/functional/base.py @@ -12,10 +12,9 @@ # License for the specific language governing permissions and limitations # under the License. +import configparser as config_parser import os -import six -import six.moves.configparser as config_parser from tempest.lib.cli import base DEFAULT_CONFIG_FILE = os.path.join(os.path.dirname(__file__), 'test.conf') @@ -55,11 +54,7 @@ class FunctionalTestBase(base.ClientTestBase): def _get_config(self): config_file = os.environ.get('ZUNCLIENT_TEST_CONFIG', DEFAULT_CONFIG_FILE) - # SafeConfigParser was deprecated in Python 3.2 - if six.PY3: - config = config_parser.ConfigParser() - else: - config = config_parser.SafeConfigParser() + config = config_parser.ConfigParser() if not config.read(config_file): self.skipTest('Skipping, no test config found @ %s' % config_file) try: diff --git a/zunclient/tests/unit/common/test_httpclient.py b/zunclient/tests/unit/common/test_httpclient.py index 68016484..85bc4820 100644 --- a/zunclient/tests/unit/common/test_httpclient.py +++ b/zunclient/tests/unit/common/test_httpclient.py @@ -13,10 +13,11 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client +from io import StringIO from unittest import mock from oslo_serialization import jsonutils -import six from zunclient import api_versions from zunclient.common.apiclient import exceptions @@ -36,7 +37,7 @@ def _get_error_body(faultstring=None, debuginfo=None): return raw_body -HTTP_CLASS = six.moves.http_client.HTTPConnection +HTTP_CLASS = http_client.HTTPConnection HTTPS_CLASS = http.VerifiedHTTPSConnection DEFAULT_TIMEOUT = 600 @@ -66,7 +67,7 @@ class HttpClientTest(utils.BaseTestCase): def test_server_exception_empty_body(self): error_body = _get_error_body() fake_resp = utils.FakeResponse({'content-type': 'application/json'}, - six.StringIO(error_body), + StringIO(error_body), version=1, status=500) client = http.HTTPClient( @@ -84,7 +85,7 @@ class HttpClientTest(utils.BaseTestCase): error_msg = 'test error msg' error_body = _get_error_body(error_msg) fake_resp = utils.FakeResponse({'content-type': 'application/json'}, - six.StringIO(error_body), + StringIO(error_body), version=1, status=500) client = http.HTTPClient( @@ -104,7 +105,7 @@ class HttpClientTest(utils.BaseTestCase): "File \\\"/usr/local/lib/python2.7/...") error_body = _get_error_body(error_msg, error_trace) fake_resp = utils.FakeResponse({'content-type': 'application/json'}, - six.StringIO(error_body), + StringIO(error_body), version=1, status=500) client = http.HTTPClient( @@ -229,7 +230,7 @@ class HttpClientTest(utils.BaseTestCase): def test_401_unauthorized_exception(self): error_body = _get_error_body() fake_resp = utils.FakeResponse({'content-type': 'text/plain'}, - six.StringIO(error_body), + StringIO(error_body), version=1, status=401) client = http.HTTPClient( diff --git a/zunclient/tests/unit/common/test_utils.py b/zunclient/tests/unit/common/test_utils.py index f873920c..94d21166 100644 --- a/zunclient/tests/unit/common/test_utils.py +++ b/zunclient/tests/unit/common/test_utils.py @@ -15,7 +15,6 @@ # under the License. import collections -import six from zunclient.common import cliutils from zunclient.common import utils @@ -187,10 +186,11 @@ class FormatArgsTest(test_utils.BaseTestCase): class CliUtilsTest(test_utils.BaseTestCase): def test_keys_and_vals_to_strs(self): - dict_in = {six.u('a'): six.u('1'), - six.u('b'): {six.u('x'): 1, - 'y': six.u('2'), - six.u('z'): six.u('3')}, + dict_in = {'a': '1', + 'b': { + 'x': 1, + 'y': '2', + 'z': '3'}, 'c': 7} dict_exp = collections.OrderedDict([ @@ -207,7 +207,7 @@ class CliUtilsTest(test_utils.BaseTestCase): ('b', collections.OrderedDict(sorted(dict_out['b'].items()))), ('c', dict_out['c'])]) - self.assertEqual(six.text_type(dict_exp), six.text_type(dict_act)) + self.assertEqual(str(dict_exp), str(dict_act)) class ParseNetsTest(test_utils.BaseTestCase): diff --git a/zunclient/tests/unit/test_shell.py b/zunclient/tests/unit/test_shell.py index 1cd6d0f0..ad45e299 100644 --- a/zunclient/tests/unit/test_shell.py +++ b/zunclient/tests/unit/test_shell.py @@ -12,13 +12,13 @@ # License for the specific language governing permissions and limitations # under the License. +import io import re import sys from unittest import mock import fixtures from keystoneauth1 import fixture -import six from testtools import matchers from zunclient import api_versions @@ -225,8 +225,8 @@ class ShellTest(utils.TestCase): self.fail('CommandError not raised') @mock.patch('sys.argv', ['zun']) - @mock.patch('sys.stdout', six.StringIO()) - @mock.patch('sys.stderr', six.StringIO()) + @mock.patch('sys.stdout', io.StringIO()) + @mock.patch('sys.stderr', io.StringIO()) def test_main_noargs(self): # Ensure that main works with no command-line arguments try: diff --git a/zunclient/tests/unit/utils.py b/zunclient/tests/unit/utils.py index f383249d..105ec8c0 100644 --- a/zunclient/tests/unit/utils.py +++ b/zunclient/tests/unit/utils.py @@ -15,11 +15,11 @@ import copy import datetime +import io import os import sys import fixtures -import six import testtools from zunclient import api_versions @@ -54,7 +54,7 @@ class FakeAPI(object): def raw_request(self, *args, **kwargs): response = self._request(*args, **kwargs) - body_iter = http.ResponseBodyIterator(six.StringIO(response[1])) + body_iter = http.ResponseBodyIterator(io.StringIO(response[1])) return FakeResponse(response[0]), body_iter def json_request(self, *args, **kwargs): @@ -150,8 +150,8 @@ class TestCase(testtools.TestCase): orig = sys.stdout orig_stderr = sys.stderr try: - sys.stdout = six.StringIO() - sys.stderr = six.StringIO() + sys.stdout = io.StringIO() + sys.stderr = io.StringIO() _shell = shell.OpenStackZunShell() _shell.main(argstr.split()) except SystemExit: diff --git a/zunclient/tests/unit/v1/test_containers.py b/zunclient/tests/unit/v1/test_containers.py index ad8a5113..c1dc5b6c 100644 --- a/zunclient/tests/unit/v1/test_containers.py +++ b/zunclient/tests/unit/v1/test_containers.py @@ -11,9 +11,10 @@ # under the License. import copy -from six.moves.urllib import parse + import testtools from testtools import matchers +from urllib import parse from zunclient.common import utils as zun_utils from zunclient import exceptions from zunclient.tests.unit import utils diff --git a/zunclient/v1/containers.py b/zunclient/v1/containers.py index 75bf4c20..25efe690 100644 --- a/zunclient/v1/containers.py +++ b/zunclient/v1/containers.py @@ -12,7 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. -from six.moves.urllib import parse +from urllib import parse from zunclient import api_versions from zunclient.common import base diff --git a/zunclient/v1/services.py b/zunclient/v1/services.py index 96ec6d63..1552c4ea 100644 --- a/zunclient/v1/services.py +++ b/zunclient/v1/services.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -from six.moves.urllib import parse +from urllib import parse from zunclient.common import base from zunclient.common import utils diff --git a/zunclient/v1/versions.py b/zunclient/v1/versions.py index 80050b30..0c5cb8ab 100644 --- a/zunclient/v1/versions.py +++ b/zunclient/v1/versions.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -from six.moves import urllib +import urllib from zunclient.common import base