]> granicus.if.org Git - python/commitdiff
Fix distutils’ check and register Unicode handling (#13114).
authorÉric Araujo <merwok@netwok.org>
Sun, 9 Oct 2011 05:11:19 +0000 (07:11 +0200)
committerÉric Araujo <merwok@netwok.org>
Sun, 9 Oct 2011 05:11:19 +0000 (07:11 +0200)
The check command was fixed by Kirill Kuzminykh.

The register command was using StringIO.getvalue, which uses “''.join”
and thus coerces to str using the default encoding (ASCII), so I changed
the code to use one extra intermediary list and correctly encode to
UTF-8.

Lib/distutils/command/check.py
Lib/distutils/command/register.py
Lib/distutils/tests/test_check.py
Lib/distutils/tests/test_register.py
Misc/ACKS
Misc/NEWS

index bc29baaba4364b79c6412598249e6f32395be274..4b64e458bc2dd2cc4e5fa0a008732b18e609e835 100644 (file)
@@ -5,6 +5,7 @@ Implements the Distutils 'check' command.
 __revision__ = "$Id$"
 
 from distutils.core import Command
+from distutils.dist import PKG_INFO_ENCODING
 from distutils.errors import DistutilsSetupError
 
 try:
@@ -108,6 +109,8 @@ class check(Command):
     def check_restructuredtext(self):
         """Checks if the long string fields are reST-compliant."""
         data = self.distribution.get_long_description()
+        if not isinstance(data, unicode):
+            data = data.decode(PKG_INFO_ENCODING)
         for warning in self._check_rst_data(data):
             line = warning[-1].get('line')
             if line is None:
index dc089902f1c5b6814218dc80ac3d9b56c031ae86..edb42b955d6ab59276db6dc7da5188f61c84782d 100644 (file)
@@ -10,7 +10,6 @@ __revision__ = "$Id$"
 import urllib2
 import getpass
 import urlparse
-import StringIO
 from warnings import warn
 
 from distutils.core import PyPIRCCommand
@@ -260,21 +259,30 @@ Your selection [default 1]: ''', log.INFO)
         boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
         sep_boundary = '\n--' + boundary
         end_boundary = sep_boundary + '--'
-        body = StringIO.StringIO()
+        chunks = []
         for key, value in data.items():
             # handle multiple entries for the same name
             if type(value) not in (type([]), type( () )):
                 value = [value]
             for value in value:
-                body.write(sep_boundary)
-                body.write('\nContent-Disposition: form-data; name="%s"'%key)
-                body.write("\n\n")
-                body.write(value)
+                chunks.append(sep_boundary)
+                chunks.append('\nContent-Disposition: form-data; name="%s"'%key)
+                chunks.append("\n\n")
+                chunks.append(value)
                 if value and value[-1] == '\r':
-                    body.write('\n')  # write an extra newline (lurve Macs)
-        body.write(end_boundary)
-        body.write("\n")
-        body = body.getvalue()
+                    chunks.append('\n')  # write an extra newline (lurve Macs)
+        chunks.append(end_boundary)
+        chunks.append("\n")
+
+        # chunks may be bytes (str) or unicode objects that we need to encode
+        body = []
+        for chunk in chunks:
+            if isinstance(chunk, unicode):
+                body.append(chunk.encode('utf-8'))
+            else:
+                body.append(chunk)
+
+        body = ''.join(body)
 
         # build the Request
         headers = {
index 4ea83dcb79489cee52e0c82e9b52783aa2214bfd..f73342ade8523d343007d9b616bca0d71c3a4c27 100644 (file)
@@ -1,3 +1,4 @@
+# -*- encoding: utf8 -*-
 """Tests for distutils.command.check."""
 import unittest
 from test.test_support import run_unittest
@@ -46,6 +47,15 @@ class CheckTestCase(support.LoggingSilencer,
         cmd = self._run(metadata, strict=1)
         self.assertEqual(cmd._warnings, 0)
 
+        # now a test with Unicode entries
+        metadata = {'url': u'xxx', 'author': u'\u00c9ric',
+                    'author_email': u'xxx', u'name': 'xxx',
+                    'version': u'xxx',
+                    'description': u'Something about esszet \u00df',
+                    'long_description': u'More things about esszet \u00df'}
+        cmd = self._run(metadata)
+        self.assertEqual(cmd._warnings, 0)
+
     def test_check_document(self):
         if not HAS_DOCUTILS: # won't test without docutils
             return
@@ -80,8 +90,8 @@ class CheckTestCase(support.LoggingSilencer,
         self.assertRaises(DistutilsSetupError, self._run, metadata,
                           **{'strict': 1, 'restructuredtext': 1})
 
-        # and non-broken rest
-        metadata['long_description'] = 'title\n=====\n\ntest'
+        # and non-broken rest, including a non-ASCII character to test #12114
+        metadata['long_description'] = u'title\n=====\n\ntest \u00df'
         cmd = self._run(metadata, strict=1, restructuredtext=1)
         self.assertEqual(cmd._warnings, 0)
 
index bf634870356116ba6c4b17cb5c47f4d7f03c0842..aa9bc43c5cf1a8b1965ef385becf901c241d42f9 100644 (file)
@@ -1,5 +1,5 @@
-"""Tests for distutils.command.register."""
 # -*- encoding: utf8 -*-
+"""Tests for distutils.command.register."""
 import sys
 import os
 import unittest
@@ -246,6 +246,24 @@ class RegisterTestCase(PyPIRCCommandTestCase):
         finally:
             del register_module.raw_input
 
+        # and finally a Unicode test (bug #12114)
+        metadata = {'url': u'xxx', 'author': u'\u00c9ric',
+                    'author_email': u'xxx', u'name': 'xxx',
+                    'version': u'xxx',
+                    'description': u'Something about esszet \u00df',
+                    'long_description': u'More things about esszet \u00df'}
+
+        cmd = self._get_cmd(metadata)
+        cmd.ensure_finalized()
+        cmd.strict = 1
+        inputs = RawInputs('1', 'tarek', 'y')
+        register_module.raw_input = inputs.__call__
+        # let's run the command
+        try:
+            cmd.run()
+        finally:
+            del register_module.raw_input
+
     def test_check_metadata_deprecated(self):
         # makes sure make_metadata is deprecated
         cmd = self._get_cmd()
index b7e34de859e0abafaf95c43d5b26f0e7e335a91c..856afaa78a687eb36546fb7ef648111534d69b89 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -469,6 +469,7 @@ Ivan Krstić
 Andrew Kuchling
 Ralf W. Grosse-Kunstleve
 Vladimir Kushnir
+Kirill Kuzminykh (Кирилл Кузьминых)
 Ross Lagerwall
 Cameron Laird
 Łukasz Langa
index a69d5794837df2684c8bc0ab7b056ed55565c607..2fbd70e8dde3348744b50bed2c239bc59774a317 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -50,6 +50,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #13114: Fix the distutils commands check and register when the
+  long description is a Unicode string with non-ASCII characters.
+
 - Issue #7367: Fix pkgutil.walk_paths to skip directories whose
   contents cannot be read.