[Python-checkins] cpython (3.5): Issue #21776: distutils.upload now correctly handles HTTPError

berker.peksag python-checkins at python.org
Thu Jun 2 16:37:05 EDT 2016


https://hg.python.org/cpython/rev/17e7d6c4f082
changeset:   101615:17e7d6c4f082
branch:      3.5
parent:      101613:ffaefb20dd06
user:        Berker Peksag <berker.peksag at gmail.com>
date:        Thu Jun 02 13:45:53 2016 -0700
summary:
  Issue #21776: distutils.upload now correctly handles HTTPError

Initial patch by Claudiu Popa.

files:
  Lib/distutils/command/upload.py    |  14 ++++----
  Lib/distutils/tests/test_upload.py |  31 +++++++++++++++++-
  Misc/NEWS                          |   3 +
  3 files changed, 40 insertions(+), 8 deletions(-)


diff --git a/Lib/distutils/command/upload.py b/Lib/distutils/command/upload.py
--- a/Lib/distutils/command/upload.py
+++ b/Lib/distutils/command/upload.py
@@ -181,21 +181,21 @@
             result = urlopen(request)
             status = result.getcode()
             reason = result.msg
+        except HTTPError as e:
+            status = e.code
+            reason = e.msg
         except OSError as e:
             self.announce(str(e), log.ERROR)
             raise
-        except HTTPError as e:
-            status = e.code
-            reason = e.msg
 
         if status == 200:
             self.announce('Server response (%s): %s' % (status, reason),
                           log.INFO)
+            if self.show_response:
+                text = self._read_pypi_response(result)
+                msg = '\n'.join(('-' * 75, text, '-' * 75))
+                self.announce(msg, log.INFO)
         else:
             msg = 'Upload failed (%s): %s' % (status, reason)
             self.announce(msg, log.ERROR)
             raise DistutilsError(msg)
-        if self.show_response:
-            text = self._read_pypi_response(result)
-            msg = '\n'.join(('-' * 75, text, '-' * 75))
-            self.announce(msg, log.INFO)
diff --git a/Lib/distutils/tests/test_upload.py b/Lib/distutils/tests/test_upload.py
--- a/Lib/distutils/tests/test_upload.py
+++ b/Lib/distutils/tests/test_upload.py
@@ -1,13 +1,16 @@
 """Tests for distutils.command.upload."""
 import os
 import unittest
+import unittest.mock as mock
+from urllib.request import HTTPError
+
 from test.support import run_unittest
 
 from distutils.command import upload as upload_mod
 from distutils.command.upload import upload
 from distutils.core import Distribution
 from distutils.errors import DistutilsError
-from distutils.log import INFO
+from distutils.log import ERROR, INFO
 
 from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
 
@@ -144,6 +147,32 @@
         self.next_code = 404
         self.assertRaises(DistutilsError, self.test_upload)
 
+    def test_wrong_exception_order(self):
+        tmp = self.mkdtemp()
+        path = os.path.join(tmp, 'xxx')
+        self.write_file(path)
+        dist_files = [('xxx', '2.6', path)]  # command, pyversion, filename
+        self.write_file(self.rc, PYPIRC_LONG_PASSWORD)
+
+        pkg_dir, dist = self.create_dist(dist_files=dist_files)
+        tests = [
+            (OSError('oserror'), 'oserror', OSError),
+            (HTTPError('url', 400, 'httperror', {}, None),
+             'Upload failed (400): httperror', DistutilsError),
+        ]
+        for exception, expected, raised_exception in tests:
+            with self.subTest(exception=type(exception).__name__):
+                with mock.patch('distutils.command.upload.urlopen',
+                                new=mock.Mock(side_effect=exception)):
+                    with self.assertRaises(raised_exception):
+                        cmd = upload(dist)
+                        cmd.ensure_finalized()
+                        cmd.run()
+                    results = self.get_logs(ERROR)
+                    self.assertIn(expected, results[-1])
+                    self.clear_logs()
+
+
 def test_suite():
     return unittest.makeSuite(uploadTestCase)
 
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -128,6 +128,9 @@
 Library
 -------
 
+- Issue #21776: distutils.upload now correctly handles HTTPError.
+  Initial patch by Claudiu Popa.
+
 - Issue #27114: Fix SSLContext._load_windows_store_certs fails with
   PermissionError
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list