diff options
| author | Alex Hall <alex.mojaki@gmail.com> | 2019-10-18 11:17:10 +0200 |
|---|---|---|
| committer | Claudiu Popa <pcmanticore@gmail.com> | 2019-10-18 11:17:10 +0200 |
| commit | 8cb02857852d6c1b024d322e54288e57b56359e3 (patch) | |
| tree | c7a02fb663b0ad58407f8b6964865007ec7b7594 | |
| parent | 476d1b84025e6a980cc11fb2287426241c59977e (diff) | |
| download | astroid-git-8cb02857852d6c1b024d322e54288e57b56359e3.tar.gz | |
Fix ClassDef.as_string() with keyword arguments, especially the metaclass (#707)
* Failing test for ClassDef.as_string involving keyword arguments
* Fix construction of keyword arguments in ClassDef as_string
| -rw-r--r-- | astroid/as_string.py | 16 | ||||
| -rw-r--r-- | tests/unittest_nodes.py | 26 |
2 files changed, 32 insertions, 10 deletions
diff --git a/astroid/as_string.py b/astroid/as_string.py index 3cd6e0d2..222b6199 100644 --- a/astroid/as_string.py +++ b/astroid/as_string.py @@ -153,20 +153,16 @@ class AsStringVisitor: def visit_classdef(self, node): """return an astroid.ClassDef node as string""" decorate = node.decorators.accept(self) if node.decorators else "" - bases = ", ".join(n.accept(self) for n in node.bases) - metaclass = node.metaclass() - if metaclass and not node.has_metaclass_hack(): - if bases: - bases = "(%s, metaclass=%s)" % (bases, metaclass.name) - else: - bases = "(metaclass=%s)" % metaclass.name - else: - bases = "(%s)" % bases if bases else "" + args = [n.accept(self) for n in node.bases] + if node._metaclass and not node.has_metaclass_hack(): + args.append("metaclass=" + node._metaclass.accept(self)) + args += [n.accept(self) for n in node.keywords] + args = "(%s)" % ", ".join(args) if args else "" docs = self._docs_dedent(node.doc) if node.doc else "" return "\n\n%sclass %s%s:%s\n%s\n" % ( decorate, node.name, - bases, + args, docs, self._stmt_list(node.body), ) diff --git a/tests/unittest_nodes.py b/tests/unittest_nodes.py index 997910d1..f49a0782 100644 --- a/tests/unittest_nodes.py +++ b/tests/unittest_nodes.py @@ -220,6 +220,32 @@ if all[1] == bord[0:]: assert pre_repr == post_repr assert pre.as_string().strip() == code.strip() + def test_class_def(self): + code = """ +import abc + + +class A: + pass + + + +class B(metaclass=A, x=1): + pass + + + +class C(B): + pass + + + +class D(metaclass=abc.ABCMeta): + pass +""" + ast = abuilder.string_build(code) + self.assertEqual(ast.as_string().strip(), code.strip()) + class _NodeTest(unittest.TestCase): """test transformation of If Node""" |
