Fix TypeError on "setup.py upload --show-response".

This commit is contained in:
Antoine Pitrou 2013-12-22 18:13:51 +01:00
parent f20ea13996
commit 335a5128e5
5 changed files with 28 additions and 6 deletions

View File

@ -5,7 +5,6 @@ Implements the Distutils 'register' command (register with the repository).
# created 2002/10/21, Richard Jones # created 2002/10/21, Richard Jones
import cgi
import os, string, getpass import os, string, getpass
import io import io
import urllib.parse, urllib.request import urllib.parse, urllib.request
@ -88,9 +87,7 @@ class register(PyPIRCCommand):
''' '''
url = self.repository+'?:action=list_classifiers' url = self.repository+'?:action=list_classifiers'
response = urllib.request.urlopen(url) response = urllib.request.urlopen(url)
content_type = response.getheader('content-type', 'text/plain') log.info(self._read_pypi_response(response))
encoding = cgi.parse_header(content_type)[1].get('charset', 'ascii')
log.info(response.read().decode(encoding))
def verify_metadata(self): def verify_metadata(self):
''' Send the metadata to the package index server to be checked. ''' Send the metadata to the package index server to be checked.

View File

@ -196,5 +196,6 @@ class upload(PyPIRCCommand):
self.announce('Upload failed (%s): %s' % (status, reason), self.announce('Upload failed (%s): %s' % (status, reason),
log.ERROR) log.ERROR)
if self.show_response: if self.show_response:
msg = '\n'.join(('-' * 75, result.read(), '-' * 75)) text = self._read_pypi_response(result)
msg = '\n'.join(('-' * 75, text, '-' * 75))
self.announce(msg, log.INFO) self.announce(msg, log.INFO)

View File

@ -3,6 +3,7 @@
Provides the PyPIRCCommand class, the base class for the command classes Provides the PyPIRCCommand class, the base class for the command classes
that uses .pypirc in the distutils.command package. that uses .pypirc in the distutils.command package.
""" """
import cgi
import os import os
from configparser import ConfigParser from configparser import ConfigParser
@ -101,6 +102,12 @@ class PyPIRCCommand(Command):
return {} return {}
def _read_pypi_response(self, response):
"""Read and decode a PyPI HTTP response."""
content_type = response.getheader('content-type', 'text/plain')
encoding = cgi.parse_header(content_type)[1].get('charset', 'ascii')
return response.read().decode(encoding)
def initialize_options(self): def initialize_options(self):
"""Initialize options.""" """Initialize options."""
self.repository = None self.repository = None

View File

@ -6,6 +6,7 @@ from test.support import run_unittest
from distutils.command import upload as upload_mod from distutils.command import upload as upload_mod
from distutils.command.upload import upload from distutils.command.upload import upload
from distutils.core import Distribution from distutils.core import Distribution
from distutils.log import INFO
from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
@ -48,6 +49,14 @@ class FakeOpen(object):
self.req = None self.req = None
self.msg = 'OK' self.msg = 'OK'
def getheader(self, name, default=None):
return {
'content-type': 'text/plain; charset=utf-8',
}.get(name.lower(), default)
def read(self):
return b'xyzzy'
def getcode(self): def getcode(self):
return 200 return 200
@ -108,10 +117,11 @@ class uploadTestCase(PyPIRCCommandTestCase):
# lets run it # lets run it
pkg_dir, dist = self.create_dist(dist_files=dist_files) pkg_dir, dist = self.create_dist(dist_files=dist_files)
cmd = upload(dist) cmd = upload(dist)
cmd.show_response = 1
cmd.ensure_finalized() cmd.ensure_finalized()
cmd.run() cmd.run()
# what did we send ? # what did we send ?
headers = dict(self.last_open.req.headers) headers = dict(self.last_open.req.headers)
self.assertEqual(headers['Content-length'], '2087') self.assertEqual(headers['Content-length'], '2087')
self.assertTrue(headers['Content-type'].startswith('multipart/form-data')) self.assertTrue(headers['Content-type'].startswith('multipart/form-data'))
@ -120,6 +130,11 @@ class uploadTestCase(PyPIRCCommandTestCase):
'https://pypi.python.org/pypi') 'https://pypi.python.org/pypi')
self.assertIn(b'xxx', self.last_open.req.data) self.assertIn(b'xxx', self.last_open.req.data)
# The PyPI response body was echoed
results = self.get_logs(INFO)
self.assertIn('xyzzy\n', results[-1])
def test_suite(): def test_suite():
return unittest.makeSuite(uploadTestCase) return unittest.makeSuite(uploadTestCase)

View File

@ -29,6 +29,8 @@ Core and Builtins
Library Library
------- -------
- Fix TypeError on "setup.py upload --show-response".
- Issue #12226: HTTPS is now used by default when connecting to PyPI. - Issue #12226: HTTPS is now used by default when connecting to PyPI.
- Issue #20045: Fix "setup.py register --list-classifiers". - Issue #20045: Fix "setup.py register --list-classifiers".