From 5ac72fcb3d2071d8fd4c382a48efe5b9dbd4dec9 Mon Sep 17 00:00:00 2001 From: Riccardo Pittau Date: Wed, 1 Jul 2020 15:22:44 +0200 Subject: [PATCH] Remove six library The tooz project doesn't support Python 2 anymore, using the six library should not be necessary. Change-Id: I9886cabcd13cbc615065ceb372efbf037dff1aeb --- examples/group_membership.py | 4 +--- examples/group_membership_watch.py | 4 +--- examples/leader_election.py | 4 +--- requirements.txt | 1 - tooz/coordination.py | 11 +++++------ tooz/drivers/etcd.py | 4 ++-- tooz/drivers/etcd3.py | 3 +-- tooz/drivers/etcd3gw.py | 5 +++-- tooz/drivers/file.py | 11 ++++------- tooz/drivers/ipc.py | 5 ++--- tooz/drivers/memcached.py | 9 ++++----- tooz/drivers/pgsql.py | 6 +----- tooz/drivers/redis.py | 23 ++++++++++------------- tooz/drivers/zookeeper.py | 8 +++----- tooz/hashring.py | 6 ++---- tooz/locking.py | 5 +---- tooz/partitioner.py | 4 ++-- tooz/tests/__init__.py | 4 +--- tooz/tests/test_coordination.py | 4 ++-- tooz/tests/test_partitioner.py | 7 +++---- tooz/tests/test_utils.py | 3 +-- tooz/utils.py | 9 ++++----- 22 files changed, 54 insertions(+), 86 deletions(-) diff --git a/examples/group_membership.py b/examples/group_membership.py index 7b85e6ce..9f4bb978 100644 --- a/examples/group_membership.py +++ b/examples/group_membership.py @@ -1,14 +1,12 @@ import uuid -import six - from tooz import coordination coordinator = coordination.get_coordinator('zake://', b'host-1') coordinator.start() # Create a group -group = six.binary_type(six.text_type(uuid.uuid4()).encode('ascii')) +group = bytes(str(uuid.uuid4()).encode('ascii')) request = coordinator.create_group(group) request.get() diff --git a/examples/group_membership_watch.py b/examples/group_membership_watch.py index 51836c20..b1118a67 100644 --- a/examples/group_membership_watch.py +++ b/examples/group_membership_watch.py @@ -1,14 +1,12 @@ import uuid -import six - from tooz import coordination coordinator = coordination.get_coordinator('zake://', b'host-1') coordinator.start() # Create a group -group = six.binary_type(six.text_type(uuid.uuid4()).encode('ascii')) +group = bytes(str(uuid.uuid4()).encode('ascii')) request = coordinator.create_group(group) request.get() diff --git a/examples/leader_election.py b/examples/leader_election.py index 661c3142..364e9bc4 100644 --- a/examples/leader_election.py +++ b/examples/leader_election.py @@ -1,8 +1,6 @@ import time import uuid -import six - from tooz import coordination ALIVE_TIME = 1 @@ -10,7 +8,7 @@ coordinator = coordination.get_coordinator('zake://', b'host-1') coordinator.start() # Create a group -group = six.binary_type(six.text_type(uuid.uuid4()).encode('ascii')) +group = bytes(str(uuid.uuid4()).encode('ascii')) request = coordinator.create_group(group) request.get() diff --git a/requirements.txt b/requirements.txt index c1f072cd..a448b672 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,6 @@ # process, which may cause wedges in the gate later. pbr>=1.6 # Apache-2.0 stevedore>=1.16.0 # Apache-2.0 -six>=1.9.0 # MIT voluptuous>=0.8.9 # BSD License msgpack>=0.4.0 # Apache-2.0 fasteners>=0.7 # Apache-2.0 diff --git a/tooz/coordination.py b/tooz/coordination.py index 99cdff0a..d5ac9418 100755 --- a/tooz/coordination.py +++ b/tooz/coordination.py @@ -21,11 +21,11 @@ from concurrent import futures import enum import logging import threading +import urllib from oslo_utils import encodeutils from oslo_utils import netutils from oslo_utils import timeutils -import six from stevedore import driver import tenacity @@ -629,8 +629,7 @@ class CoordinationDriver(object): pass -@six.add_metaclass(abc.ABCMeta) -class CoordAsyncResult(object): +class CoordAsyncResult(object, metaclass=abc.ABCMeta): """Representation of an asynchronous task. Every call API returns an CoordAsyncResult object on which the result or @@ -786,12 +785,12 @@ def get_coordinator(backend_url, member_id, arguments query string) """ parsed_url = netutils.urlsplit(backend_url) - parsed_qs = six.moves.urllib.parse.parse_qs(parsed_url.query) + parsed_qs = urllib.parse.parse_qs(parsed_url.query) if kwargs: options = {} - for (k, v) in six.iteritems(kwargs): + for (k, v) in kwargs.items(): options[k] = [v] - for (k, v) in six.iteritems(parsed_qs): + for (k, v) in parsed_qs.items(): if k not in options: options[k] = v else: diff --git a/tooz/drivers/etcd.py b/tooz/drivers/etcd.py index 45bacca0..5d9a186f 100644 --- a/tooz/drivers/etcd.py +++ b/tooz/drivers/etcd.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +import functools import logging import threading @@ -19,7 +20,6 @@ import fasteners from oslo_utils import encodeutils from oslo_utils import timeutils import requests -import six import tooz from tooz import coordination @@ -33,7 +33,7 @@ LOG = logging.getLogger(__name__) def _translate_failures(func): """Translates common requests exceptions into tooz exceptions.""" - @six.wraps(func) + @functools.wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) diff --git a/tooz/drivers/etcd3.py b/tooz/drivers/etcd3.py index 8dcdaa7c..1b708ee3 100644 --- a/tooz/drivers/etcd3.py +++ b/tooz/drivers/etcd3.py @@ -18,7 +18,6 @@ import threading import etcd3 from etcd3 import exceptions as etcd3_exc from oslo_utils import encodeutils -import six import tooz from tooz import _retry @@ -48,7 +47,7 @@ def _failure_translator(): def _translate_failures(func): - @six.wraps(func) + @functools.wraps(func) def wrapper(*args, **kwargs): with _failure_translator(): return func(*args, **kwargs) diff --git a/tooz/drivers/etcd3gw.py b/tooz/drivers/etcd3gw.py index 4b9cada6..232b3aec 100644 --- a/tooz/drivers/etcd3gw.py +++ b/tooz/drivers/etcd3gw.py @@ -11,14 +11,15 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. + import base64 +import functools import threading import uuid import etcd3gw from etcd3gw import exceptions as etcd3_exc from oslo_utils import encodeutils -import six import tooz from tooz import _retry @@ -35,7 +36,7 @@ def _encode(data): def _translate_failures(func): """Translates common requests exceptions into tooz exceptions.""" - @six.wraps(func) + @functools.wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) diff --git a/tooz/drivers/file.py b/tooz/drivers/file.py index 2ffa0a37..eb26eb0d 100644 --- a/tooz/drivers/file.py +++ b/tooz/drivers/file.py @@ -32,7 +32,6 @@ import fasteners from oslo_utils import encodeutils from oslo_utils import fileutils from oslo_utils import timeutils -import six import voluptuous import tooz @@ -74,7 +73,7 @@ def _convert_from_old_format(data): # example of potential old python3 payload: # {u"member_id": b"member"} # {u"member_id": u"member"} - if six.PY3 and b"member_id" in data or b"group_id" in data: + if b"member_id" in data or b"group_id" in data: data = dict((k.decode("utf8"), v) for k, v in data.items()) # About member_id and group_id valuse if the file have been written # with python2 and in the old format, we can't known with python3 @@ -91,7 +90,7 @@ def _lock_me(lock): def wrapper(func): - @six.wraps(func) + @functools.wraps(func) def decorator(*args, **kwargs): with lock: return func(*args, **kwargs) @@ -361,14 +360,12 @@ class FileDriver(coordination.CoordinationDriverCachedRunWatchers, _SCHEMAS = { 'group': voluptuous.Schema({ - voluptuous.Required('group_id'): voluptuous.Any(six.text_type, - six.binary_type), + voluptuous.Required('group_id'): voluptuous.Any(str, bytes), # NOTE(sileht): tooz <1.36 was creating file without this voluptuous.Optional('encoded'): bool, }), 'member': voluptuous.Schema({ - voluptuous.Required('member_id'): voluptuous.Any(six.text_type, - six.binary_type), + voluptuous.Required('member_id'): voluptuous.Any(str, bytes), voluptuous.Required('joined_on'): datetime.datetime, # NOTE(sileht): tooz <1.36 was creating file without this voluptuous.Optional('encoded'): bool, diff --git a/tooz/drivers/ipc.py b/tooz/drivers/ipc.py index 50885dc5..bcb7a00b 100644 --- a/tooz/drivers/ipc.py +++ b/tooz/drivers/ipc.py @@ -19,7 +19,6 @@ import struct import time import msgpack -import six import sysv_ipc import tooz @@ -37,10 +36,10 @@ def ftok(name, project): # Similar to ftok & http://semanchuk.com/philip/sysv_ipc/#ftok_weakness # but hopefully without as many weaknesses... h = hashlib.md5() - if not isinstance(project, six.binary_type): + if not isinstance(project, bytes): project = project.encode('ascii') h.update(project) - if not isinstance(name, six.binary_type): + if not isinstance(name, bytes): name = name.encode('ascii') h.update(name) return (int(h.hexdigest(), 16) % _KEY_RANGE) + sysv_ipc.KEY_MIN diff --git a/tooz/drivers/memcached.py b/tooz/drivers/memcached.py index ad409d1e..1cefd954 100644 --- a/tooz/drivers/memcached.py +++ b/tooz/drivers/memcached.py @@ -22,7 +22,6 @@ import socket from oslo_utils import encodeutils from pymemcache import client as pymemcache_client -import six import tooz from tooz import _retry @@ -65,7 +64,7 @@ def _failure_translator(): def _translate_failures(func): - @six.wraps(func) + @functools.wraps(func) def wrapper(*args, **kwargs): with _failure_translator(): return func(*args, **kwargs) @@ -266,7 +265,7 @@ class MemcachedDriver(coordination.CoordinationDriverCachedRunWatchers, @staticmethod def _msgpack_serializer(key, value): - if isinstance(value, six.binary_type): + if isinstance(value, bytes): return value, 1 return utils.dumps(value), 2 @@ -435,7 +434,7 @@ class MemcachedDriver(coordination.CoordinationDriverCachedRunWatchers, if group_members is None: raise coordination.GroupNotCreated(group_id) actual_group_members = {} - for m, v in six.iteritems(group_members): + for m, v in group_members.items(): # Never kick self from the group, we know we're alive if (m == self._member_id or self.client.get(self._encode_member_id(m))): @@ -512,7 +511,7 @@ class MemcachedDriver(coordination.CoordinationDriverCachedRunWatchers, @_translate_failures def run_elect_coordinator(self): - for group_id, hooks in six.iteritems(self._hooks_elected_leader): + for group_id, hooks in self._hooks_elected_leader.items(): # Try to grab the lock, if that fails, that means someone has it # already. leader_lock = self._get_leader_lock(group_id) diff --git a/tooz/drivers/pgsql.py b/tooz/drivers/pgsql.py index 6c60a208..71b7ae37 100644 --- a/tooz/drivers/pgsql.py +++ b/tooz/drivers/pgsql.py @@ -20,7 +20,6 @@ import logging from oslo_utils import encodeutils import psycopg2 -import six import tooz from tooz import _retry @@ -101,10 +100,7 @@ class PostgresLock(locking.Lock): self._options = options h = hashlib.md5() h.update(name) - if six.PY2: - self.key = list(map(ord, h.digest()[0:2])) - else: - self.key = h.digest()[0:2] + self.key = h.digest()[0:2] def acquire(self, blocking=True, shared=False): diff --git a/tooz/drivers/redis.py b/tooz/drivers/redis.py index f388f4d4..0c01a1bf 100644 --- a/tooz/drivers/redis.py +++ b/tooz/drivers/redis.py @@ -26,9 +26,6 @@ from oslo_utils import strutils import redis from redis import exceptions from redis import sentinel -import six -from six.moves import map as compat_map -from six.moves import zip as compat_zip import tooz from tooz import coordination @@ -55,7 +52,7 @@ def _translate_failures(): class RedisLock(locking.Lock): def __init__(self, coord, client, name, timeout): - name = "%s_%s_lock" % (coord.namespace, six.text_type(name)) + name = "%s_%s_lock" % (coord.namespace, str(name)) super(RedisLock, self).__init__(name) # NOTE(jd) Make sure we don't release and heartbeat at the same time by # using a exclusive access lock (LP#1557593) @@ -356,7 +353,7 @@ return 1 self._scripts = {} def _check_fetch_redis_version(self, geq_version, not_existent=True): - if isinstance(geq_version, six.string_types): + if isinstance(geq_version, str): desired_version = version.LooseVersion(geq_version) elif isinstance(geq_version, version.LooseVersion): desired_version = geq_version @@ -470,12 +467,12 @@ return 1 # For py3.x ensure these are unicode since the string template # replacement will expect unicode (and we don't want b'' as a # prefix which will happen in py3.x if this is not done). - for (k, v) in six.iteritems(tpl_params.copy()): - if isinstance(v, six.binary_type): + for (k, v) in tpl_params.copy().items(): + if isinstance(v, bytes): v = v.decode('ascii') tpl_params[k] = v prepared_scripts = {} - for name, raw_script_tpl in six.iteritems(self.SCRIPTS): + for name, raw_script_tpl in self.SCRIPTS.items(): script_tpl = string.Template(raw_script_tpl) script = script_tpl.substitute(**tpl_params) prepared_scripts[name] = self._client.register_script(script) @@ -630,10 +627,10 @@ return 1 return set() # Ok now we need to see which members have passed away... gone_members = set() - member_values = p.mget(compat_map(self._encode_beat_id, - potential_members)) - for (potential_member, value) in compat_zip(potential_members, - member_values): + member_values = p.mget(map(self._encode_beat_id, + potential_members)) + for (potential_member, value) in zip(potential_members, + member_values): # Always preserve self (just incase we haven't heartbeated # while this call/s was being made...), this does *not* prevent # another client from removing this though... @@ -742,7 +739,7 @@ return 1 return self.get_lock(name) def run_elect_coordinator(self): - for group_id, hooks in six.iteritems(self._hooks_elected_leader): + for group_id, hooks in self._hooks_elected_leader.items(): leader_lock = self._get_leader_lock(group_id) if leader_lock.acquire(blocking=False): # We got the lock diff --git a/tooz/drivers/zookeeper.py b/tooz/drivers/zookeeper.py index db57f19e..e08708b9 100644 --- a/tooz/drivers/zookeeper.py +++ b/tooz/drivers/zookeeper.py @@ -25,8 +25,6 @@ from kazoo.handlers import threading as threading_handler from kazoo.protocol import paths from oslo_utils import encodeutils from oslo_utils import strutils -import six -from six.moves import filter as compat_filter import tooz from tooz import coordination @@ -444,7 +442,7 @@ class KazooDriver(coordination.CoordinationDriverCachedRunWatchers): args.extend(more_args) cleaned_args = [] for arg in args: - if isinstance(arg, six.binary_type): + if isinstance(arg, bytes): cleaned_args.append(arg.decode('ascii')) else: cleaned_args.append(arg) @@ -467,7 +465,7 @@ class KazooDriver(coordination.CoordinationDriverCachedRunWatchers): auth_data = None maybe_hosts = [parsed_url.netloc] + list(options.get('hosts', [])) - hosts = list(compat_filter(None, maybe_hosts)) + hosts = list(filter(None, maybe_hosts)) if not hosts: hosts = ['localhost:2181'] randomize_hosts = options.get('randomize_hosts', True) @@ -520,7 +518,7 @@ class KazooDriver(coordination.CoordinationDriverCachedRunWatchers): return ZooKeeperLock(name, z_lock) def run_elect_coordinator(self): - for group_id in six.iterkeys(self._hooks_elected_leader): + for group_id in self._hooks_elected_leader.keys(): leader_lock = self._get_group_leader_lock(group_id) if leader_lock.is_acquired: # Previously acquired/still leader, leave it be... diff --git a/tooz/hashring.py b/tooz/hashring.py index bfe8638d..51016f2b 100644 --- a/tooz/hashring.py +++ b/tooz/hashring.py @@ -16,8 +16,6 @@ import bisect import hashlib -import six - import tooz from tooz import utils @@ -71,7 +69,7 @@ class HashRing(object): for node in nodes: key = utils.to_binary(node, 'utf-8') key_hash = hashlib.md5(key) - for r in six.moves.range(self._partition_number * weight): + for r in range(self._partition_number * weight): key_hash.update(key) self._ring[self._hash2int(key_hash)] = node @@ -93,7 +91,7 @@ class HashRing(object): key = utils.to_binary(node, 'utf-8') key_hash = hashlib.md5(key) - for r in six.moves.range(self._partition_number * weight): + for r in range(self._partition_number * weight): key_hash.update(key) del self._ring[self._hash2int(key_hash)] diff --git a/tooz/locking.py b/tooz/locking.py index f4ae0f02..20890f6d 100644 --- a/tooz/locking.py +++ b/tooz/locking.py @@ -15,8 +15,6 @@ # under the License. import abc -import six - import tooz from tooz import coordination @@ -34,8 +32,7 @@ class _LockProxy(object): self.lock.__exit__(exc_type, exc_val, exc_tb) -@six.add_metaclass(abc.ABCMeta) -class Lock(object): +class Lock(object, metaclass=abc.ABCMeta): def __init__(self, name): if not name: raise ValueError("Locks must be provided a name") diff --git a/tooz/partitioner.py b/tooz/partitioner.py index 63eaba07..3a23f9ea 100644 --- a/tooz/partitioner.py +++ b/tooz/partitioner.py @@ -13,7 +13,7 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. -import six + from tooz import hashring @@ -54,7 +54,7 @@ class Partitioner(object): def _hash_object(obj): if hasattr(obj, "__tooz_hash__"): return obj.__tooz_hash__() - return six.text_type(obj).encode('utf8') + return str(obj).encode('utf8') def members_for_object(self, obj, ignore_members=None, replicas=1): """Return the members responsible for an object. diff --git a/tooz/tests/__init__.py b/tooz/tests/__init__.py index 505ef5f0..b7acfa14 100644 --- a/tooz/tests/__init__.py +++ b/tooz/tests/__init__.py @@ -19,7 +19,6 @@ import os import fixtures from oslo_utils import uuidutils -import six from testtools import testcase import tooz @@ -49,8 +48,7 @@ class SkipNotImplementedMeta(type): return type.__new__(cls, name, bases, local) -@six.add_metaclass(SkipNotImplementedMeta) -class TestWithCoordinator(testcase.TestCase): +class TestWithCoordinator(testcase.TestCase, metaclass=SkipNotImplementedMeta): url = os.getenv("TOOZ_TEST_URL") def setUp(self): diff --git a/tooz/tests/test_coordination.py b/tooz/tests/test_coordination.py index 1153458f..55f3b687 100644 --- a/tooz/tests/test_coordination.py +++ b/tooz/tests/test_coordination.py @@ -17,9 +17,9 @@ import threading import time from unittest import mock +import urllib from concurrent import futures -from six.moves.urllib import parse from testtools import matchers from testtools import testcase @@ -49,7 +49,7 @@ class TestAPI(tests.TestWithCoordinator): if (tooz.coordination.Characteristics.DISTRIBUTED_ACROSS_HOSTS not in self._coord.CHARACTERISTICS): self.skipTest("This driver is not distributed across hosts") - scheme = parse.urlparse(self.url).scheme + scheme = urllib.parse.urlparse(self.url).scheme coord = tooz.coordination.get_coordinator( "%s://localhost:1/f00" % scheme, self.member_id) diff --git a/tooz/tests/test_partitioner.py b/tooz/tests/test_partitioner.py index 30aeb02e..39c13b61 100644 --- a/tooz/tests/test_partitioner.py +++ b/tooz/tests/test_partitioner.py @@ -13,7 +13,6 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. -import six from tooz import coordination from tooz import tests @@ -32,7 +31,7 @@ class TestPartitioner(tests.TestWithCoordinator): def _add_members(self, number_of_members, weight=1): groups = [] - for _ in six.moves.range(number_of_members): + for _ in range(number_of_members): m = tests.get_random_uuid() coord = coordination.get_coordinator(self.url, m) coord.start() @@ -43,7 +42,7 @@ class TestPartitioner(tests.TestWithCoordinator): return groups def _remove_members(self, number_of_members): - for _ in six.moves.range(number_of_members): + for _ in range(number_of_members): c = self._extra_coords.pop() c.stop() self._coord.run_watchers() @@ -80,7 +79,7 @@ class TestPartitioner(tests.TestWithCoordinator): def test_members_of_object_and_others(self): p = self._coord.join_partitioned_group(self.group_id) self._add_members(3) - o = six.text_type(u"чупакабра") + o = str(u"чупакабра") m = p.members_for_object(o) self.assertEqual(1, len(m)) m = m.pop() diff --git a/tooz/tests/test_utils.py b/tooz/tests/test_utils.py index 39f83fb0..717f4fdb 100644 --- a/tooz/tests/test_utils.py +++ b/tooz/tests/test_utils.py @@ -19,7 +19,6 @@ import os import tempfile import futurist -import six from testtools import testcase import tooz @@ -113,7 +112,7 @@ class TestUtilsCollapse(testcase.TestCase): 'b': [2], 'c': (1, 2, 3), } - c_ex = utils.collapse(ex, exclude=set(six.iterkeys(ex))) + c_ex = utils.collapse(ex, exclude=set(ex.keys())) self.assertEqual(ex, c_ex) def test_custom_selector(self): diff --git a/tooz/utils.py b/tooz/utils.py index 1d7b959f..4d4ec27d 100644 --- a/tooz/utils.py +++ b/tooz/utils.py @@ -24,7 +24,6 @@ import msgpack from oslo_serialization import msgpackutils from oslo_utils import encodeutils from oslo_utils import excutils -import six import tooz @@ -36,7 +35,7 @@ class Base64LockEncoder(object): self.keyspace_url += prefix def check_and_encode(self, name): - if not isinstance(name, (six.text_type, six.binary_type)): + if not isinstance(name, (str, bytes)): raise TypeError("Provided lock name is expected to be a string" " or binary type and not %s" % type(name)) try: @@ -47,7 +46,7 @@ class Base64LockEncoder(object): % encodeutils.exception_to_unicode(e)) def encode(self, name): - if isinstance(name, six.text_type): + if isinstance(name, str): name = name.encode("ascii") enc_name = base64.urlsafe_b64encode(name) return self.keyspace_url + "/" + enc_name.decode("ascii") @@ -154,7 +153,7 @@ def collapse(config, exclude=None, item_selector=operator.itemgetter(-1)): if exclude is None: exclude = set() collapsed = {} - for (k, v) in six.iteritems(config): + for (k, v) in config.items(): if isinstance(v, (tuple, list)): if k in exclude: collapsed[k] = v @@ -168,7 +167,7 @@ def collapse(config, exclude=None, item_selector=operator.itemgetter(-1)): def to_binary(text, encoding='ascii'): """Return the binary representation of string (if not already binary).""" - if not isinstance(text, six.binary_type): + if not isinstance(text, bytes): text = text.encode(encoding) return text