瀏覽代碼

Drop six dependency

Replace six.string_types/text_type/integer_types with str/int;
six.u()-on-string-types branches were dead in Py3 and deleted.
six.reraise inside an active except becomes a bare raise; the
middleware Py2/Py3 fork collapses to `raise cb_ex from e`. Switch
gcp/helpers from six.moves.urllib.parse to stdlib urllib.parse,
and inline six.ensure_binary.

Also remove the configparser try/except shim in base/provider.py
that fell back to Py2's SafeConfigParser.
Nuwan Goonasekera 1 天之前
父節點
當前提交
5120e8b095

+ 3 - 16
cloudbridge/base/helpers.py

@@ -3,7 +3,6 @@ import functools
 import logging
 import os
 import re
-import sys
 from contextlib import contextmanager
 
 from cryptography.hazmat.backends import default_backend
@@ -12,8 +11,6 @@ from cryptography.hazmat.primitives.asymmetric import rsa
 
 from deprecation import deprecated
 
-import six
-
 import cloudbridge
 
 from ..interfaces.exceptions import InvalidParamException
@@ -50,7 +47,7 @@ def filter_by(prop_name, kwargs, objs):
     """
     prop_val = kwargs.pop(prop_name, None)
     if prop_val:
-        if isinstance(prop_val, six.string_types):
+        if isinstance(prop_val, str):
             regex = fnmatch.translate(prop_val)
             results = [o for o in objs
                        if getattr(o, prop_name)
@@ -101,12 +98,11 @@ def cleanup_action(cleanup_func):
     try:
         yield
     except Exception:
-        ex_class, ex_val, ex_traceback = sys.exc_info()
         try:
             cleanup_func()
         except Exception:
             log.exception("Error during exception cleanup: ")
-        six.reraise(ex_class, ex_val, ex_traceback)
+        raise
     try:
         cleanup_func()
     except Exception:
@@ -117,11 +113,6 @@ def get_env(varname, default_value=None):
     """
     Return the value of the environment variable or default_value.
 
-    This is a helper method that wraps ``os.environ.get`` to ensure type
-    compatibility across py2 and py3. For py2, any value obtained from an
-    environment variable, ensure ``unicode`` type and ``str`` for py3. The
-    casting is done only for string variables.
-
     :type varname: ``str``
     :param varname: Name of the environment variable for which to check.
 
@@ -131,11 +122,7 @@ def get_env(varname, default_value=None):
     :return: Value of the supplied environment if found; value of
              ``default_value`` otherwise.
     """
-    value = os.environ.get(varname, default_value)
-    if isinstance(value, six.string_types) and not isinstance(
-            value, six.text_type):
-        return six.u(value)
-    return value
+    return os.environ.get(varname, default_value)
 
 
 # Alias deprecation decorator, following:

+ 4 - 12
cloudbridge/base/middleware.py

@@ -1,12 +1,9 @@
 import logging
-import sys
 
 from pyeventsystem.middleware import dispatch as pyevent_dispatch
 from pyeventsystem.middleware import intercept
 from pyeventsystem.middleware import observe
 
-import six
-
 from ..interfaces.exceptions import CloudBridgeBaseException
 
 log = logging.getLogger(__name__)
@@ -46,12 +43,7 @@ class ExceptionWrappingMiddleware(object):
         except Exception as e:
             if isinstance(e, CloudBridgeBaseException):
                 raise
-            else:
-                ex_type, ex_value, traceback = sys.exc_info()
-                cb_ex = CloudBridgeBaseException(
-                    "CloudBridgeBaseException: {0} from exception type: {1}"
-                    .format(ex_value, ex_type))
-                if sys.version_info >= (3, 0):
-                    six.raise_from(cb_ex, e)
-                else:
-                    six.reraise(CloudBridgeBaseException, cb_ex, traceback)
+            cb_ex = CloudBridgeBaseException(
+                "CloudBridgeBaseException: {0} from exception type: {1}"
+                .format(e, type(e)))
+            raise cb_ex from e

+ 1 - 9
cloudbridge/base/provider.py

@@ -3,16 +3,11 @@ import ast
 import functools
 import logging
 import os
+from configparser import ConfigParser
 from os.path import expanduser
-try:
-    from configparser import ConfigParser
-except ImportError:  # Python 2
-    from ConfigParser import SafeConfigParser as ConfigParser
 
 from pyeventsystem.middleware import SimpleMiddlewareManager
 
-import six
-
 from ..base.middleware import ExceptionWrappingMiddleware
 from ..interfaces import CloudProvider
 from ..interfaces.exceptions import ProviderConnectionException
@@ -206,7 +201,4 @@ class BaseCloudProvider(CloudProvider):
         elif (self._config_parser.has_option(self.PROVIDER_ID, key) and
               self._config_parser.get(self.PROVIDER_ID, key)):
             value = self._config_parser.get(self.PROVIDER_ID, key)
-        if isinstance(value, six.string_types) and not isinstance(
-                value, six.text_type):
-            return six.u(value)
         return value

+ 1 - 3
cloudbridge/base/resources.py

@@ -10,8 +10,6 @@ import shutil
 import time
 import uuid
 
-import six
-
 from cloudbridge.interfaces.exceptions import \
     InvalidConfigurationException
 from cloudbridge.interfaces.exceptions import InvalidLabelException
@@ -378,7 +376,7 @@ class BaseLaunchConfig(LaunchConfig):
             raise InvalidConfigurationException(
                 "Source must be a Snapshot, Volume, MachineImage, or None.")
         if size:
-            if not isinstance(size, six.integer_types) or not size > 0:
+            if not isinstance(size, int) or not size > 0:
                 log.exception("InvalidConfigurationException raised: "
                               "size argument must be an integer greater than "
                               "0. Got type %s and value %s.", type(size), size)

+ 5 - 4
cloudbridge/providers/gcp/helpers.py

@@ -3,9 +3,7 @@ import collections
 import datetime
 import hashlib
 import re
-
-import six
-from six.moves.urllib.parse import quote
+from urllib.parse import quote
 
 from googleapiclient.errors import HttpError
 
@@ -204,7 +202,10 @@ def generate_signed_url(credentials, bucket_name, object_name,
         # max allowed expiration time is 7 days
         expiration = 604800
 
-    escaped_object_name = quote(six.ensure_binary(object_name), safe=b'/~')
+    escaped_object_name = quote(
+        object_name.encode('utf-8') if isinstance(object_name, str)
+        else object_name,
+        safe=b'/~')
     canonical_uri = '/{}'.format(escaped_object_name)
 
     datetime_now = datetime.datetime.utcnow()

+ 0 - 1
pyproject.toml

@@ -26,7 +26,6 @@ classifiers = [
     "Topic :: Software Development :: Libraries :: Python Modules",
 ]
 dependencies = [
-    "six>=1.11",
     "tenacity>=6.0",
     "deprecation>=2.0.7",
     "pyeventsystem<2",

+ 4 - 6
tests/test_block_store_service.py

@@ -1,7 +1,5 @@
 import time
 
-import six
-
 from cloudbridge.base import helpers as cb_helpers
 from cloudbridge.factory import ProviderList
 from cloudbridge.interfaces import SnapshotState
@@ -107,13 +105,13 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
             with cb_helpers.cleanup_action(lambda: test_vol.delete()):
                 test_vol.wait_till_ready()
                 self.assertTrue(
-                    isinstance(test_vol.size, six.integer_types) and
+                    isinstance(test_vol.size, int) and
                     test_vol.size >= 0,
                     "Volume.size must be a positive number, but got %s"
                     % test_vol.size)
                 self.assertTrue(
                     test_vol.description is None or
-                    isinstance(test_vol.description, six.string_types),
+                    isinstance(test_vol.description, str),
                     "Volume.description must be None or a string. Got: %s"
                     % test_vol.description)
                 self.assertIsNone(test_vol.source)
@@ -207,14 +205,14 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
             with cb_helpers.cleanup_action(lambda: cleanup_snap(test_snap)):
                 test_snap.wait_till_ready()
-                self.assertTrue(isinstance(test_vol.size, six.integer_types))
+                self.assertTrue(isinstance(test_vol.size, int))
                 self.assertEqual(
                     test_snap.size, test_vol.size,
                     "Snapshot.size must match original volume's size: %s"
                     " but is: %s" % (test_vol.size, test_snap.size))
                 self.assertTrue(
                     test_vol.description is None or
-                    isinstance(test_vol.description, six.string_types),
+                    isinstance(test_vol.description, str),
                     "Snapshot.description must be None or a string. Got: %s"
                     % test_vol.description)
                 self.assertEqual(test_vol.id, test_snap.volume_id)

+ 1 - 3
tests/test_cloud_helpers.py

@@ -1,7 +1,5 @@
 import itertools
 
-import six
-
 from cloudbridge.base.helpers import get_env
 from cloudbridge.base.resources import ClientPagedResultList
 from cloudbridge.base.resources import ServerPagedResultList
@@ -84,7 +82,7 @@ class CloudHelpersTestCase(ProviderTestBase):
         self.provider.config['text_type_check'] = 'test-text'
         # pylint:disable=protected-access
         config_value = self.provider._get_config_value('text_type_check', None)
-        self.assertIsInstance(config_value, six.string_types)
+        self.assertIsInstance(config_value, str)
 
         # pylint:disable=protected-access
         none_value = self.provider._get_config_value(

+ 2 - 4
tests/test_compute_service.py

@@ -1,8 +1,6 @@
 import datetime
 import ipaddress
 
-import six
-
 from cloudbridge.base import helpers as cb_helpers
 from cloudbridge.base.resources import BaseNetwork
 from cloudbridge.factory import ProviderList
@@ -120,7 +118,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
                              "Image id {0} is not equal to the expected id"
                              " {1}".format(test_instance.image_id, image_id))
             self.assertIsInstance(test_instance.zone_id,
-                                  six.string_types)
+                                  str)
             self.assertEqual(
                 test_instance.image_id,
                 helpers.get_provider_test_data(self.provider, "image"))
@@ -158,7 +156,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
                 self._is_valid_ip(ip_address),
                 "Instance must have a valid IP address. Got: %s" % ip_address)
             self.assertIsInstance(test_instance.vm_type_id,
-                                  six.string_types)
+                                  str)
             vm_type = self.provider.compute.vm_types.get(
                 test_instance.vm_type_id)
             self.assertEqual(

+ 1 - 3
tests/test_region_service.py

@@ -1,5 +1,3 @@
-import six
-
 from cloudbridge.interfaces import Region
 
 from tests import helpers
@@ -61,7 +59,7 @@ class CloudRegionServiceTestCase(ProviderTestBase):
                 self.assertTrue(zone.name)
                 self.assertTrue(zone.region_name is None or
                                 isinstance(zone.region_name,
-                                           six.string_types))
+                                           str))
                 if test_zone == zone.name:
                     zone_find_count += 1
         # zone info cannot be repeated between regions

+ 3 - 5
tests/test_vm_types_service.py

@@ -1,5 +1,3 @@
-import six
-
 from tests import helpers
 from tests.helpers import ProviderTestBase
 from tests.helpers import standard_interface_tests as sit
@@ -34,12 +32,12 @@ class CloudVMTypeServiceTestCase(ProviderTestBase):
             self.assertTrue(
                 vm_type.family is None or isinstance(
                     vm_type.family,
-                    six.string_types),
+                    str),
                 "VMType family must be None or a"
                 " string but is: {0}".format(vm_type.family))
             self.assertTrue(
                 vm_type.vcpus is None or (
-                    isinstance(vm_type.vcpus, six.integer_types) and
+                    isinstance(vm_type.vcpus, int) and
                     vm_type.vcpus >= 0),
                 "VMType vcpus must be None or a positive integer but is: {0}"
                 .format(vm_type.vcpus))
@@ -58,7 +56,7 @@ class CloudVMTypeServiceTestCase(ProviderTestBase):
                 " number")
             self.assertTrue(
                 isinstance(vm_type.num_ephemeral_disks,
-                           six.integer_types) and
+                           int) and
                 vm_type.num_ephemeral_disks >= 0,
                 "VMType num_ephemeral_disks must be None or a positive"
                 " number")