[Python-checkins] r88169 - in python/branches/release27-maint: Lib/argparse.py Lib/test/test_argparse.py Misc/NEWS

steven.bethard python-checkins at python.org
Mon Jan 24 21:40:15 CET 2011


Author: steven.bethard
Date: Mon Jan 24 21:40:15 2011
New Revision: 88169
Log:
Issue #9509: make argarse properly handle IOErrors raised by argparse.FileType. Approved by Georg in the tracker.
Modified:
 python/branches/release27-maint/Lib/argparse.py
 python/branches/release27-maint/Lib/test/test_argparse.py
 python/branches/release27-maint/Misc/NEWS
Modified: python/branches/release27-maint/Lib/argparse.py
==============================================================================
--- python/branches/release27-maint/Lib/argparse.py	(original)
+++ python/branches/release27-maint/Lib/argparse.py	Mon Jan 24 21:40:15 2011
@@ -1109,7 +1109,7 @@
 the builtin open() function.
 """
 
- def __init__(self, mode='r', bufsize=None):
+ def __init__(self, mode='r', bufsize=-1):
 self._mode = mode
 self._bufsize = bufsize
 
@@ -1125,14 +1125,15 @@
 raise ValueError(msg)
 
 # all other arguments are used as file names
- if self._bufsize:
+ try:
 return open(string, self._mode, self._bufsize)
- else:
- return open(string, self._mode)
+ except IOError as e:
+ message = _("can't open '%s': %s")
+ raise ArgumentTypeError(message % (string, e))
 
 def __repr__(self):
- args = [self._mode, self._bufsize]
- args_str = ', '.join([repr(arg) for arg in args if arg is not None])
+ args = self._mode, self._bufsize
+ args_str = ', '.join(repr(arg) for arg in args if arg != -1)
 return '%s(%s)' % (type(self).__name__, args_str)
 
 # ===========================
Modified: python/branches/release27-maint/Lib/test/test_argparse.py
==============================================================================
--- python/branches/release27-maint/Lib/test/test_argparse.py	(original)
+++ python/branches/release27-maint/Lib/test/test_argparse.py	Mon Jan 24 21:40:15 2011
@@ -4,6 +4,7 @@
 import inspect
 import os
 import shutil
+import stat
 import sys
 import textwrap
 import tempfile
@@ -46,14 +47,13 @@
 
 def tearDown(self):
 os.chdir(self.old_dir)
- while True:
- try:
- shutil.rmtree(self.temp_dir)
- except WindowsError:
- continue
- else:
- break
+ shutil.rmtree(self.temp_dir, True)
 
+ def create_readonly_file(self, filename):
+ file_path = os.path.join(self.temp_dir, filename)
+ with open(file_path, 'w') as file:
+ file.write(filename)
+ os.chmod(file_path, stat.S_IREAD)
 
 class Sig(object):
 
@@ -1451,17 +1451,19 @@
 file = open(os.path.join(self.temp_dir, file_name), 'w')
 file.write(file_name)
 file.close()
+ self.create_readonly_file('readonly')
 
 argument_signatures = [
 Sig('-x', type=argparse.FileType()),
 Sig('spam', type=argparse.FileType('r')),
 ]
- failures = ['-x', '-x bar']
+ failures = ['-x', '-x bar', 'non-existent-file.txt']
 successes = [
 ('foo', NS(x=None, spam=RFile('foo'))),
 ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
 ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
 ('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
+ ('readonly', NS(x=None, spam=RFile('readonly'))),
 ]
 
 
@@ -1510,11 +1512,16 @@
 class TestFileTypeW(TempDirMixin, ParserTestCase):
 """Test the FileType option/argument type for writing files"""
 
+ def setUp(self):
+ super(TestFileTypeW, self).setUp()
+ self.create_readonly_file('readonly')
+
 argument_signatures = [
 Sig('-x', type=argparse.FileType('w')),
 Sig('spam', type=argparse.FileType('w')),
 ]
 failures = ['-x', '-x bar']
+ failures = ['-x', '-x bar', 'readonly']
 successes = [
 ('foo', NS(x=None, spam=WFile('foo'))),
 ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
Modified: python/branches/release27-maint/Misc/NEWS
==============================================================================
--- python/branches/release27-maint/Misc/NEWS	(original)
+++ python/branches/release27-maint/Misc/NEWS	Mon Jan 24 21:40:15 2011
@@ -140,6 +140,9 @@
 OSError exception when The OS had been told to ignore SIGCLD in our process
 or otherwise not wait for exiting child processes.
 
+- Issue #9509: argparse now properly handles IOErrors raised by
+ argparse.FileType.
+
 Extension Modules
 -----------------
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /