[Python-checkins] r77717 - in python/trunk: Lib/distutils/command/register.py Lib/distutils/command/upload.py Lib/distutils/dist.py Lib/distutils/tests/test_register.py Lib/distutils/tests/test_upload.py Misc/NEWS

tarek.ziade python-checkins at python.org
Sun Jan 24 01:33:33 CET 2010


Author: tarek.ziade
Date: Sun Jan 24 01:33:32 2010
New Revision: 77717

Log:
Fixed #7748: now upload and register commands don't need to force the encoding anymore : DistributionMetada returns utf8 strings

Modified:
   python/trunk/Lib/distutils/command/register.py
   python/trunk/Lib/distutils/command/upload.py
   python/trunk/Lib/distutils/dist.py
   python/trunk/Lib/distutils/tests/test_register.py
   python/trunk/Lib/distutils/tests/test_upload.py
   python/trunk/Misc/NEWS

Modified: python/trunk/Lib/distutils/command/register.py
==============================================================================
--- python/trunk/Lib/distutils/command/register.py	(original)
+++ python/trunk/Lib/distutils/command/register.py	Sun Jan 24 01:33:32 2010
@@ -266,7 +266,6 @@
             if type(value) not in (type([]), type( () )):
                 value = [value]
             for value in value:
-                value = unicode(value).encode("utf-8")
                 body.write(sep_boundary)
                 body.write('\nContent-Disposition: form-data; name="%s"'%key)
                 body.write("\n\n")

Modified: python/trunk/Lib/distutils/command/upload.py
==============================================================================
--- python/trunk/Lib/distutils/command/upload.py	(original)
+++ python/trunk/Lib/distutils/command/upload.py	Sun Jan 24 01:33:32 2010
@@ -145,7 +145,7 @@
                     value = value[1]
                 else:
                     fn = ""
-                value = str(value)
+
                 body.write(sep_boundary)
                 body.write('\nContent-Disposition: form-data; name="%s"'%key)
                 body.write(fn)

Modified: python/trunk/Lib/distutils/dist.py
==============================================================================
--- python/trunk/Lib/distutils/dist.py	(original)
+++ python/trunk/Lib/distutils/dist.py	Sun Jan 24 01:33:32 2010
@@ -1139,16 +1139,19 @@
         self._write_list(file, 'Obsoletes', self.get_obsoletes())
 
     def _write_field(self, file, name, value):
-        if isinstance(value, unicode):
-            value = value.encode(PKG_INFO_ENCODING)
-        else:
-            value = str(value)
-        file.write('%s: %s\n' % (name, value))
+        file.write('%s: %s\n' % (name, self._encode_field(value)))
 
     def _write_list (self, file, name, values):
         for value in values:
             self._write_field(file, name, value)
 
+    def _encode_field(self, value):
+        if value is None:
+            return None
+        if isinstance(value, unicode):
+            return value.encode(PKG_INFO_ENCODING)
+        return str(value)
+
     # -- Metadata query methods ----------------------------------------
 
     def get_name(self):
@@ -1161,19 +1164,20 @@
         return "%s-%s" % (self.get_name(), self.get_version())
 
     def get_author(self):
-        return self.author or "UNKNOWN"
+        return self._encode_field(self.author) or "UNKNOWN"
 
     def get_author_email(self):
         return self.author_email or "UNKNOWN"
 
     def get_maintainer(self):
-        return self.maintainer or "UNKNOWN"
+        return self._encode_field(self.maintainer) or "UNKNOWN"
 
     def get_maintainer_email(self):
         return self.maintainer_email or "UNKNOWN"
 
     def get_contact(self):
-        return self.maintainer or self.author or "UNKNOWN"
+        return (self._encode_field(self.maintainer) or
+                self._encode_field(self.author) or "UNKNOWN")
 
     def get_contact_email(self):
         return self.maintainer_email or self.author_email or "UNKNOWN"
@@ -1186,10 +1190,10 @@
     get_licence = get_license
 
     def get_description(self):
-        return self.description or "UNKNOWN"
+        return self._encode_field(self.description) or "UNKNOWN"
 
     def get_long_description(self):
-        return self.long_description or "UNKNOWN"
+        return self._encode_field(self.long_description) or "UNKNOWN"
 
     def get_keywords(self):
         return self.keywords or []

Modified: python/trunk/Lib/distutils/tests/test_register.py
==============================================================================
--- python/trunk/Lib/distutils/tests/test_register.py	(original)
+++ python/trunk/Lib/distutils/tests/test_register.py	Sun Jan 24 01:33:32 2010
@@ -1,4 +1,5 @@
 """Tests for distutils.command.register."""
+# -*- encoding: utf8 -*-
 import sys
 import os
 import unittest
@@ -136,9 +137,7 @@
         self.assertTrue(self.conn.reqs, 2)
         req1 = dict(self.conn.reqs[0].headers)
         req2 = dict(self.conn.reqs[1].headers)
-
-        self.assertEquals(req1['Content-length'], '1374')
-        self.assertEquals(req2['Content-length'], '1374')
+        self.assertEquals(req2['Content-length'], req1['Content-length'])
         self.assertTrue('xxx' in self.conn.reqs[1].data)
 
     def test_password_not_in_file(self):
@@ -210,7 +209,7 @@
 
         # metadata are OK but long_description is broken
         metadata = {'url': 'xxx', 'author': 'xxx',
-                    'author_email': 'xxx',
+                    'author_email': u'éxéxé',
                     'name': 'xxx', 'version': 'xxx',
                     'long_description': 'title\n==\n\ntext'}
 

Modified: python/trunk/Lib/distutils/tests/test_upload.py
==============================================================================
--- python/trunk/Lib/distutils/tests/test_upload.py	(original)
+++ python/trunk/Lib/distutils/tests/test_upload.py	Sun Jan 24 01:33:32 2010
@@ -1,4 +1,5 @@
 """Tests for distutils.command.upload."""
+# -*- encoding: utf8 -*-
 import sys
 import os
 import unittest
@@ -107,14 +108,15 @@
         self.write_file(self.rc, PYPIRC_LONG_PASSWORD)
 
         # lets run it
-        pkg_dir, dist = self.create_dist(dist_files=dist_files)
+        pkg_dir, dist = self.create_dist(dist_files=dist_files, author=u'dédé')
         cmd = upload(dist)
         cmd.ensure_finalized()
         cmd.run()
 
         # what did we send ?
+        self.assertIn('dédé', self.last_open.req.data)
         headers = dict(self.last_open.req.headers)
-        self.assertEquals(headers['Content-length'], '2086')
+        self.assertEquals(headers['Content-length'], '2085')
         self.assertTrue(headers['Content-type'].startswith('multipart/form-data'))
         self.assertEquals(self.last_open.req.get_method(), 'POST')
         self.assertEquals(self.last_open.req.get_full_url(),

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Sun Jan 24 01:33:32 2010
@@ -42,6 +42,11 @@
 Library
 -------
 
+- Issue #7748: Since unicode values are supported for some metadata options
+  in Distutils, the DistributionMetadata get_* methods will now return an utf-8
+  encoded string for them. This ensure that the upload and register commands
+  send the right values to PyPI without any error.
+
 - Issue #1670765: Prevent email.generator.Generator from re-wrapping
   headers in multipart/signed MIME parts, which fixes one of the sources of
   invalid modifications to such parts by Generator.
@@ -186,7 +191,7 @@
 - Distutils now correctly identifies the build architecture as "x86_64"
   when building on OSX 10.6 without "-arch" flags.
 
-- Issue #7556: Distutils' msvc9compiler now opens the MSVC Manifest 
+- Issue #7556: Distutils' msvc9compiler now opens the MSVC Manifest
   file in text mode.
 
 - Issue #7552: Removed line feed in the base64 Authorization header in


More information about the Python-checkins mailing list