From 79d62a71751140315227891bbe175630f9d3edc3 Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Sat, 11 Aug 2012 16:41:25 +0200 Subject: [PATCH] [py3] Added fixer for python_2_unicode_compatible. This doesn't deal with classes that define both __unicode__ and __str__; the definition of __str__ should be removed first. It doesn't guarantee that __str__ will return a str (rather than bytes) under Python 3 either. --- django/bin/django-2to3.py | 10 +++++++ django/utils/2to3_fixes/__init__.py | 0 django/utils/2to3_fixes/fix_unicode.py | 36 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100755 django/bin/django-2to3.py create mode 100644 django/utils/2to3_fixes/__init__.py create mode 100644 django/utils/2to3_fixes/fix_unicode.py diff --git a/django/bin/django-2to3.py b/django/bin/django-2to3.py new file mode 100755 index 0000000000..35566abb94 --- /dev/null +++ b/django/bin/django-2to3.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +# This works exactly like 2to3, except that it uses Django's fixers rather +# than 2to3's built-in fixers. + +import sys +from lib2to3.main import main + +sys.exit(main("django.utils.2to3_fixes")) + diff --git a/django/utils/2to3_fixes/__init__.py b/django/utils/2to3_fixes/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/django/utils/2to3_fixes/fix_unicode.py b/django/utils/2to3_fixes/fix_unicode.py new file mode 100644 index 0000000000..613734ca86 --- /dev/null +++ b/django/utils/2to3_fixes/fix_unicode.py @@ -0,0 +1,36 @@ +"""Fixer for __unicode__ methods. + +Uses the django.utils.encoding.python_2_unicode_compatible decorator. +""" + +from __future__ import unicode_literals + +from lib2to3 import fixer_base +from lib2to3.fixer_util import find_indentation, Name, syms, touch_import +from lib2to3.pgen2 import token +from lib2to3.pytree import Leaf, Node + + +class FixUnicode(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + classdef< 'class' any+ ':' + suite< any* + funcdef< 'def' unifunc='__unicode__' + parameters< '(' NAME ')' > any+ > + any* > > + """ + + def transform(self, node, results): + unifunc = results["unifunc"] + strfunc = Name("__str__", prefix=unifunc.prefix) + unifunc.replace(strfunc) + + klass = node.clone() + klass.prefix = '\n' + find_indentation(node) + decorator = Node(syms.decorator, [Leaf(token.AT, "@"), Name('python_2_unicode_compatible')]) + decorated = Node(syms.decorated, [decorator, klass], prefix=node.prefix) + node.replace(decorated) + + touch_import('django.utils.encoding', 'python_2_unicode_compatible', decorated)