summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorE. M. Bray <erik.m.bray@gmail.com>2018-10-04 04:42:27 +0200
committerBenjamin Peterson <benjamin@python.org>2018-10-03 19:42:27 -0700
commita611f60dc73d9df64fd8ebcec1daf9f7827e29db (patch)
tree21b7198919583a54a5d20635a0f315a7e4ba791a
parentb4eb51609fac1ae232b4222fccd54c7ddfc243ab (diff)
downloadsix-git-a611f60dc73d9df64fd8ebcec1daf9f7827e29db.tar.gz
Make add_metaclass copy __qualname__ from the original class. (#260)
Fixes #259.
-rw-r--r--six.py2
-rw-r--r--test_six.py20
2 files changed, 22 insertions, 0 deletions
diff --git a/six.py b/six.py
index 8d9ac41..901ec39 100644
--- a/six.py
+++ b/six.py
@@ -844,6 +844,8 @@ def add_metaclass(metaclass):
orig_vars.pop(slots_var)
orig_vars.pop('__dict__', None)
orig_vars.pop('__weakref__', None)
+ if hasattr(cls, '__qualname__'):
+ orig_vars['__qualname__'] = cls.__qualname__
return metaclass(cls.__name__, cls.__bases__, orig_vars)
return wrapper
diff --git a/test_six.py b/test_six.py
index 980cdf3..897e232 100644
--- a/test_six.py
+++ b/test_six.py
@@ -875,6 +875,26 @@ def test_add_metaclass():
assert type(MySlotsWeakref) is Meta
+@py.test.mark.skipif("sys.version_info[:2] < (3, 3)")
+def test_add_metaclass_nested():
+ # Regression test for https://github.com/benjaminp/six/issues/259
+ class Meta(type):
+ pass
+
+ class A:
+ class B: pass
+
+ expected = 'test_add_metaclass_nested.<locals>.A.B'
+
+ assert A.B.__qualname__ == expected
+
+ class A:
+ @six.add_metaclass(Meta)
+ class B: pass
+
+ assert A.B.__qualname__ == expected
+
+
@py.test.mark.skipif("sys.version_info[:2] < (2, 7) or sys.version_info[:2] in ((3, 0), (3, 1))")
def test_assertCountEqual():
class TestAssertCountEqual(unittest.TestCase):