From b76a0b0da5abbeae67effb6d285794baf194a1fd Mon Sep 17 00:00:00 2001 From: confuseh Date: Wed, 12 Oct 2016 15:20:31 +0100 Subject: [PATCH] Various py3 fixes * Bases don't work well with __slots__ [is ok on py2, not py3] * Various places import from UserDict [py3 renamed it to collections] --- disco/bot/providers/base.py | 6 ++++-- disco/types/base.py | 11 +++++++---- disco/util/hashmap.py | 6 ++++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/disco/bot/providers/base.py b/disco/bot/providers/base.py index 033b020..80b371f 100644 --- a/disco/bot/providers/base.py +++ b/disco/bot/providers/base.py @@ -3,8 +3,10 @@ import pickle from six.moves import map -from UserDict import UserDict - +if six.PY2: + from UserDict import UserDict +else: + from collections import UserDict ROOT_SENTINEL = u'\u200B' SEP_SENTINEL = u'\u200D' diff --git a/disco/types/base.py b/disco/types/base.py index 4c98170..bfaa191 100644 --- a/disco/types/base.py +++ b/disco/types/base.py @@ -159,7 +159,7 @@ def binary(obj): return obj.decode('utf-8') return unicode(obj) else: - return bytes(obj) + return bytes(obj, 'utf-8') def with_equality(field): @@ -199,11 +199,14 @@ class ModelMeta(type): dct = {k: v for k, v in six.iteritems(dct) if k not in fields} if SlottedModel and any(map(lambda k: issubclass(k, SlottedModel), parents)): - bases = set(k for k, v in six.iteritems(dct) if isinstance(v, CachedSlotProperty)) + # Bases conflict with slots, now it's fine on py2 since it replaces it, on py3 that doesn't work are they even needed? + # bases = set(k for k, v in six.iteritems(dct) if isinstance(v, CachedSlotProperty)) if '__slots__' in dct: - dct['__slots__'] = tuple(set(dct['__slots__']) | set(fields.keys()) | bases) + # dct['__slots__'] = tuple(set(dct['__slots__']) | set(fields.keys()) | bases) + dct['__slots__'] = tuple(set(dct['__slots__']) | set(fields.keys())) else: - dct['__slots__'] = tuple(fields.keys()) + tuple(bases) + # dct['__slots__'] = tuple(fields.keys()) + tuple(bases) + dct['__slots__'] = tuple(fields.keys()) dct['_fields'] = fields return super(ModelMeta, cls).__new__(cls, name, parents, dct) diff --git a/disco/util/hashmap.py b/disco/util/hashmap.py index 72f008a..31615ef 100644 --- a/disco/util/hashmap.py +++ b/disco/util/hashmap.py @@ -2,8 +2,10 @@ import six from six.moves import filter, map from collections import defaultdict -from UserDict import IterableUserDict - +if six.PY2: + from UserDict import IterableUserDict +else: + from collections import UserDict as IterableUserDict class HashMap(IterableUserDict): def items(self):