diff --git a/python-python-memcached-no-six.patch b/python-python-memcached-no-six.patch new file mode 100644 index 0000000..5b776cc --- /dev/null +++ b/python-python-memcached-no-six.patch @@ -0,0 +1,472 @@ +Index: python-memcached-1.59/memcache.py +=================================================================== +--- python-memcached-1.59.orig/memcache.py ++++ python-memcached-1.59/memcache.py +@@ -45,7 +45,6 @@ More detailed documentation is available + + """ + +-from __future__ import print_function + + import binascii + from io import BytesIO +@@ -56,13 +55,7 @@ import threading + import time + import zlib + +-import six +- +-if six.PY2: +- # With Python 2, the faster C implementation has to be imported explicitly. +- import cPickle as pickle +-else: +- import pickle ++import pickle + + + def cmemcache_hash(key): +@@ -107,7 +100,7 @@ _SOCKET_TIMEOUT = 3 # number of seconds + + + class Client(threading.local): +- """Object representing a pool of memcache servers. ++ r"""Object representing a pool of memcache servers. + + See L{memcache} for an overview. + +@@ -207,7 +200,7 @@ class Client(threading.local): + to ensure it is the correct length and composed of the right + characters. + """ +- super(Client, self).__init__() ++ super().__init__() + self.debug = debug + self.dead_retry = dead_retry + self.socket_timeout = socket_timeout +@@ -243,19 +236,18 @@ class Client(threading.local): + + def _encode_key(self, key): + if isinstance(key, tuple): +- if isinstance(key[1], six.text_type): ++ if isinstance(key[1], str): + return (key[0], key[1].encode('utf8')) +- elif isinstance(key, six.text_type): ++ elif isinstance(key, str): + return key.encode('utf8') + return key + + def _encode_cmd(self, cmd, key, headers, noreply, *args): +- cmd_bytes = cmd.encode('utf-8') if six.PY3 else cmd ++ cmd_bytes = cmd.encode('utf-8') + fullcmd = [cmd_bytes, b' ', key] + + if headers: +- if six.PY3: +- headers = headers.encode('utf-8') ++ headers = headers.encode('utf-8') + fullcmd.append(b' ') + fullcmd.append(headers) + +@@ -311,11 +303,11 @@ class Client(threading.local): + if not s.connect(): + continue + if s.family == socket.AF_INET: +- name = '%s:%s (%s)' % (s.ip, s.port, s.weight) ++ name = '{}:{} ({})'.format(s.ip, s.port, s.weight) + elif s.family == socket.AF_INET6: +- name = '[%s]:%s (%s)' % (s.ip, s.port, s.weight) ++ name = '[{}]:{} ({})'.format(s.ip, s.port, s.weight) + else: +- name = 'unix:%s (%s)' % (s.address, s.weight) ++ name = 'unix:{} ({})'.format(s.address, s.weight) + if not stat_args: + s.send_cmd('stats') + else: +@@ -338,11 +330,11 @@ class Client(threading.local): + if not s.connect(): + continue + if s.family == socket.AF_INET: +- name = '%s:%s (%s)' % (s.ip, s.port, s.weight) ++ name = '{}:{} ({})'.format(s.ip, s.port, s.weight) + elif s.family == socket.AF_INET6: +- name = '[%s]:%s (%s)' % (s.ip, s.port, s.weight) ++ name = '[{}]:{} ({})'.format(s.ip, s.port, s.weight) + else: +- name = 'unix:%s (%s)' % (s.address, s.weight) ++ name = 'unix:{} ({})'.format(s.address, s.weight) + serverData = {} + data.append((name, serverData)) + s.send_cmd('stats slabs') +@@ -369,11 +361,11 @@ class Client(threading.local): + if not s.connect(): + continue + if s.family == socket.AF_INET: +- name = '%s:%s (%s)' % (s.ip, s.port, s.weight) ++ name = '{}:{} ({})'.format(s.ip, s.port, s.weight) + elif s.family == socket.AF_INET6: +- name = '[%s]:%s (%s)' % (s.ip, s.port, s.weight) ++ name = '[{}]:{} ({})'.format(s.ip, s.port, s.weight) + else: +- name = 'unix:%s (%s)' % (s.address, s.weight) ++ name = 'unix:{} ({})'.format(s.address, s.weight) + serverData = {} + data.append((name, serverData)) + s.send_cmd('stats items') +@@ -434,7 +426,7 @@ class Client(threading.local): + # print("(using server %s)" % server,) + return server, key + serverhash = str(serverhash) + str(i) +- if isinstance(serverhash, six.text_type): ++ if isinstance(serverhash, str): + serverhash = serverhash.encode('ascii') + serverhash = serverHashFunction(serverhash) + return None, None +@@ -479,7 +471,7 @@ class Client(threading.local): + dead_servers = [] + + rc = 1 +- for server in six.iterkeys(server_keys): ++ for server in server_keys.keys(): + bigcmd = [] + write = bigcmd.append + if time is not None: +@@ -491,7 +483,7 @@ class Client(threading.local): + write(cmd) + try: + server.send_cmds(b''.join(bigcmd)) +- except socket.error as msg: ++ except OSError as msg: + rc = 0 + if isinstance(msg, tuple): + msg = msg[1] +@@ -506,11 +498,11 @@ class Client(threading.local): + for server in dead_servers: + del server_keys[server] + +- for server, keys in six.iteritems(server_keys): ++ for server, keys in server_keys.items(): + try: + for key in keys: + server.expect(b"DELETED") +- except socket.error as msg: ++ except OSError as msg: + if isinstance(msg, tuple): + msg = msg[1] + server.mark_dead(msg) +@@ -568,7 +560,7 @@ class Client(threading.local): + return 1 + self.debuglog('%s expected %s, got: %r' + % (cmd, b' or '.join(expected), line)) +- except socket.error as msg: ++ except OSError as msg: + if isinstance(msg, tuple): + msg = msg[1] + server.mark_dead(msg) +@@ -642,7 +634,7 @@ class Client(threading.local): + if line is None or line.strip() == b'NOT_FOUND': + return None + return int(line) +- except socket.error as msg: ++ except OSError as msg: + if isinstance(msg, tuple): + msg = msg[1] + server.mark_dead(msg) +@@ -789,11 +781,10 @@ class Client(threading.local): + serverhash, key = orig_key + + key = self._encode_key(key) +- if not isinstance(key, six.binary_type): ++ if not isinstance(key, bytes): + # set_multi supports int / long keys. + key = str(key) +- if six.PY3: +- key = key.encode('utf8') ++ key = key.encode('utf8') + bytes_orig_key = key + + # Gotta pre-mangle key before hashing to a +@@ -804,11 +795,10 @@ class Client(threading.local): + orig_key = orig_key[1] + else: + key = self._encode_key(orig_key) +- if not isinstance(key, six.binary_type): ++ if not isinstance(key, bytes): + # set_multi supports int / long keys. + key = str(key) +- if six.PY3: +- key = key.encode('utf8') ++ key = key.encode('utf8') + bytes_orig_key = key + server, key = self._get_server(key_prefix + key) + +@@ -893,13 +883,13 @@ class Client(threading.local): + self._statlog('set_multi') + + server_keys, prefixed_to_orig_key = self._map_and_prefix_keys( +- six.iterkeys(mapping), key_prefix) ++ mapping.keys(), key_prefix) + + # send out all requests on each server before reading anything + dead_servers = [] + notstored = [] # original keys. + +- for server in six.iterkeys(server_keys): ++ for server in server_keys.keys(): + bigcmd = [] + write = bigcmd.append + try: +@@ -917,7 +907,7 @@ class Client(threading.local): + else: + notstored.append(prefixed_to_orig_key[key]) + server.send_cmds(b''.join(bigcmd)) +- except socket.error as msg: ++ except OSError as msg: + if isinstance(msg, tuple): + msg = msg[1] + server.mark_dead(msg) +@@ -935,7 +925,7 @@ class Client(threading.local): + if not server_keys: + return list(mapping.keys()) + +- for server, keys in six.iteritems(server_keys): ++ for server, keys in server_keys.items(): + try: + for key in keys: + if server.readline() == b'STORED': +@@ -943,7 +933,7 @@ class Client(threading.local): + else: + # un-mangle. + notstored.append(prefixed_to_orig_key[key]) +- except (_Error, socket.error) as msg: ++ except (_Error, OSError) as msg: + if isinstance(msg, tuple): + msg = msg[1] + server.mark_dead(msg) +@@ -960,23 +950,15 @@ class Client(threading.local): + # subclasses of native types (such as markup-safe strings) are pickled + # and restored as instances of the correct class. + val_type = type(val) +- if val_type == six.binary_type: ++ if val_type == bytes: + pass +- elif val_type == six.text_type: ++ elif val_type == str: + flags |= Client._FLAG_TEXT + val = val.encode('utf-8') + elif val_type == int: + flags |= Client._FLAG_INTEGER + val = '%d' % val +- if six.PY3: +- val = val.encode('ascii') +- # force no attempt to compress this silly string. +- min_compress_len = 0 +- elif six.PY2 and isinstance(val, long): # noqa: F821 +- flags |= Client._FLAG_LONG +- val = str(val) +- if six.PY3: +- val = val.encode('ascii') ++ val = val.encode('ascii') + # force no attempt to compress this silly string. + min_compress_len = 0 + else: +@@ -1042,7 +1024,7 @@ class Client(threading.local): + if noreply: + return True + return server.expect(b"STORED", raise_exception=True) == b"STORED" +- except socket.error as msg: ++ except OSError as msg: + if isinstance(msg, tuple): + msg = msg[1] + server.mark_dead(msg) +@@ -1055,7 +1037,7 @@ class Client(threading.local): + try: + if server._get_socket(): + return _unsafe_set() +- except (_ConnectionDeadError, socket.error) as msg: ++ except (_ConnectionDeadError, OSError) as msg: + server.mark_dead(msg) + return 0 + +@@ -1071,7 +1053,7 @@ class Client(threading.local): + self._statlog(cmd) + + try: +- cmd_bytes = cmd.encode('utf-8') if six.PY3 else cmd ++ cmd_bytes = cmd.encode('utf-8') + fullcmd = b''.join((cmd_bytes, b' ', key)) + server.send_cmd(fullcmd) + rkey = flags = rlen = cas_id = None +@@ -1093,7 +1075,7 @@ class Client(threading.local): + value = self._recv_value(server, flags, rlen) + finally: + server.expect(b"END", raise_exception=True) +- except (_Error, socket.error) as msg: ++ except (_Error, OSError) as msg: + if isinstance(msg, tuple): + msg = msg[1] + server.mark_dead(msg) +@@ -1109,7 +1091,7 @@ class Client(threading.local): + if server.connect(): + return _unsafe_get() + return None +- except (_ConnectionDeadError, socket.error) as msg: ++ except (_ConnectionDeadError, OSError) as msg: + server.mark_dead(msg) + return None + +@@ -1189,11 +1171,11 @@ class Client(threading.local): + + # send out all requests on each server before reading anything + dead_servers = [] +- for server in six.iterkeys(server_keys): ++ for server in server_keys.keys(): + try: + fullcmd = b"get " + b" ".join(server_keys[server]) + server.send_cmd(fullcmd) +- except socket.error as msg: ++ except OSError as msg: + if isinstance(msg, tuple): + msg = msg[1] + server.mark_dead(msg) +@@ -1204,7 +1186,7 @@ class Client(threading.local): + del server_keys[server] + + retvals = {} +- for server in six.iterkeys(server_keys): ++ for server in server_keys.keys(): + try: + line = server.readline() + while line and line != b'END': +@@ -1215,7 +1197,7 @@ class Client(threading.local): + # un-prefix returned key. + retvals[prefixed_to_orig_key[rkey]] = val + line = server.readline() +- except (_Error, socket.error) as msg: ++ except (_Error, OSError) as msg: + if isinstance(msg, tuple): + msg = msg[1] + server.mark_dead(msg) +@@ -1264,10 +1246,7 @@ class Client(threading.local): + elif flags & Client._FLAG_INTEGER: + val = int(buf) + elif flags & Client._FLAG_LONG: +- if six.PY3: +- val = int(buf) +- else: +- val = long(buf) # noqa: F821 ++ val = int(buf) + elif flags & Client._FLAG_PICKLE: + try: + file = BytesIO(buf) +@@ -1300,14 +1279,14 @@ class Client(threading.local): + key = key[1] + if key is None: + raise Client.MemcachedKeyNoneError("Key is None") +- if key is '': +- if key_extra_len is 0: ++ if key == '': ++ if key_extra_len == 0: + raise Client.MemcachedKeyNoneError("Key is empty") + + # key is empty but there is some other component to key + return + +- if not isinstance(key, six.binary_type): ++ if not isinstance(key, bytes): + raise Client.MemcachedKeyTypeError("Key must be a binary string") + + if (self.server_max_key_length != 0 and +@@ -1320,7 +1299,7 @@ class Client(threading.local): + "Control/space characters not allowed (key=%r)" % key) + + +-class _Host(object): ++class _Host: + + def __init__(self, host, debug=0, dead_retry=_DEAD_RETRY, + socket_timeout=_SOCKET_TIMEOUT, flush_on_reconnect=0): +@@ -1383,7 +1362,7 @@ class _Host(object): + return 0 + + def mark_dead(self, reason): +- self.debuglog("MemCache: %s: %s. Marking dead." % (self, reason)) ++ self.debuglog("MemCache: {}: {}. Marking dead.".format(self, reason)) + self.deaduntil = time.time() + self.dead_retry + if self.flush_on_reconnect: + self.flush_on_next_connect = 1 +@@ -1402,7 +1381,7 @@ class _Host(object): + except socket.timeout as msg: + self.mark_dead("connect: %s" % msg) + return None +- except socket.error as msg: ++ except OSError as msg: + if isinstance(msg, tuple): + msg = msg[1] + self.mark_dead("connect: %s" % msg) +@@ -1420,13 +1399,13 @@ class _Host(object): + self.socket = None + + def send_cmd(self, cmd): +- if isinstance(cmd, six.text_type): ++ if isinstance(cmd, str): + cmd = cmd.encode('utf8') + self.socket.sendall(cmd + b'\r\n') + + def send_cmds(self, cmds): + """cmds already has trailing \r\n's applied.""" +- if isinstance(cmds, six.text_type): ++ if isinstance(cmds, str): + cmds = cmds.encode('utf8') + self.socket.sendall(cmds) + +@@ -1462,11 +1441,8 @@ class _Host(object): + def expect(self, text, raise_exception=False): + line = self.readline(raise_exception) + if self.debug and line != text: +- if six.PY3: +- text = text.decode('utf8') +- log_line = line.decode('utf8', 'replace') +- else: +- log_line = line ++ text = text.decode('utf8') ++ log_line = line.decode('utf8', 'replace') + self.debuglog("while expecting %r, got unexpected response %r" + % (text, log_line)) + return line +@@ -1497,7 +1473,7 @@ class _Host(object): + elif self.family == socket.AF_INET6: + return "inet6:[%s]:%d%s" % (self.address[0], self.address[1], d) + else: +- return "unix:%s%s" % (self.address, d) ++ return "unix:{}{}".format(self.address, d) + + + def _doctest(): +@@ -1508,7 +1484,7 @@ def _doctest(): + globs = {"mc": mc} + results = doctest.testmod(memcache, globs=globs) + mc.disconnect_all() +- print("Doctests: %s" % (results,)) ++ print("Doctests: {}".format(results)) + if results.failed: + sys.exit(1) + +Index: python-memcached-1.59/requirements.txt +=================================================================== +--- python-memcached-1.59.orig/requirements.txt ++++ python-memcached-1.59/requirements.txt +@@ -1 +0,0 @@ +-six>=1.4.0 +Index: python-memcached-1.59/tests/utils.py +=================================================================== +--- python-memcached-1.59.orig/tests/utils.py ++++ python-memcached-1.59/tests/utils.py +@@ -1,7 +1,7 @@ + from contextlib import contextmanager + import sys + +-from six import StringIO ++from io import StringIO + + + @contextmanager diff --git a/python-python-memcached.changes b/python-python-memcached.changes index 356c636..6f409be 100644 --- a/python-python-memcached.changes +++ b/python-python-memcached.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Thu Jun 1 09:27:51 UTC 2023 - pgajdos@suse.com + +- run pyupgrade +- added patches + https://github.com/linsomniac/python-memcached/pull/186 + + python-python-memcached-no-six.patch + ------------------------------------------------------------------- Tue Dec 13 00:36:09 UTC 2022 - Matej Cepl diff --git a/python-python-memcached.spec b/python-python-memcached.spec index 2c0abbb..8c71731 100644 --- a/python-python-memcached.spec +++ b/python-python-memcached.spec @@ -1,7 +1,7 @@ # # spec file for package python-python-memcached # -# Copyright (c) 2022 SUSE LLC +# Copyright (c) 2023 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -25,15 +25,15 @@ License: Python-2.0 Group: Development/Languages/Python URL: https://github.com/linsomniac/python-memcached Source: https://github.com/linsomniac/python-memcached/archive/%{version}.tar.gz +# https://github.com/linsomniac/python-memcached/pull/186 +Patch0: python-python-memcached-no-six.patch BuildRequires: %{python_module pytest} BuildRequires: %{python_module setuptools} -BuildRequires: %{python_module six} BuildRequires: fdupes BuildRequires: memcached BuildRequires: python-rpm-macros BuildRequires: util-linux Requires: memcached -Requires: python-six BuildArch: noarch %ifpython2 Provides: %{oldpython}-memcached = %{version} @@ -51,7 +51,7 @@ or more, possibly remote, memcached servers. Search google for memcached for more information. %prep -%setup -q -n python-memcached-%{version} +%autosetup -p1 -n python-memcached-%{version} sed -i \ -e 's:#!%{_bindir}/env python::' \ memcache.py