Blob Blame History Raw
From 9a6736f8e714297eb11bbbbfd7e01db5396673ec Mon Sep 17 00:00:00 2001
From: Fedora Ninjas <python-astroid-owner@fedoraproject.org>
Date: Mon, 30 Nov 2015 15:08:02 -0800
Subject: [PATCH] UnicodeEncodeError in AsStringVisitor.visit_functiondef

Fix from upstream issue tracker:
https://bitbucket.org/logilab/astroid/issues/273/regression-unicodeencodeerror-in
---
 astroid/as_string.py               | 14 +++++++-------
 astroid/tests/unittest_regrtest.py | 17 +++++++++++++++++
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/astroid/as_string.py b/astroid/as_string.py
index d7786fe..829c69b 100644
--- a/astroid/as_string.py
+++ b/astroid/as_string.py
@@ -287,13 +287,13 @@ class AsStringVisitor(object):
             trailer = return_annotation + ":"
         else:
             trailer = ":"
-        def_format = "\n{decorators}def {name}({args}){trailer}{docs}\n{body}"
-        return def_format.format(decorators=decorate,
-                                 name=node.name,
-                                 args=node.args.accept(self),
-                                 trailer=trailer,
-                                 docs=docs,
-                                 body=self._stmt_list(node.body))
+        def_format = "\n%sdef %s(%s)%s%s\n%s"
+        return def_format % (decorate,
+                             node.name,
+                             node.args.accept(self),
+                             trailer,
+                             docs,
+                             self._stmt_list(node.body))
 
     def visit_generatorexp(self, node):
         """return an astroid.GeneratorExp node as string"""
diff --git a/astroid/tests/unittest_regrtest.py b/astroid/tests/unittest_regrtest.py
index 3e22152..b255bfe 100644
--- a/astroid/tests/unittest_regrtest.py
+++ b/astroid/tests/unittest_regrtest.py
@@ -282,6 +282,23 @@ def test():
         ''')
         self.assertRaises(exceptions.InferenceError, next, node.infer())
 
+    def test_unicode_in_docstring(self):
+        # Crashed for astroid==1.4.1
+        # Test for https://bitbucket.org/logilab/astroid/issues/273/
+
+        # In a regular file, "coding: utf-8" would have been used.
+        node = extract_node(u'''
+        from __future__ import unicode_literals
+
+        class MyClass(object):
+            def method(self):
+                "With unicode : %s "
+
+        instance = MyClass()
+        ''' % u"\u2019")
+
+        next(node.value.infer()).as_string()
+
 
 class Whatever(object):
     a = property(lambda x: x, lambda x: x)
-- 
2.5.0