Kaydet (Commit) b0270110 authored tarafından Steven Bethard's avatar Steven Bethard

Issue #9509: make argarse properly handle IOErrors raised by argparse.FileType.…

Issue #9509: make argarse properly handle IOErrors raised by argparse.FileType. Approved by Georg in the tracker.
üst 2a6ac15f
......@@ -1121,7 +1121,7 @@ class FileType(object):
the builtin open() function.
"""
def __init__(self, mode='r', bufsize=None):
def __init__(self, mode='r', bufsize=-1):
self._mode = mode
self._bufsize = bufsize
......@@ -1137,14 +1137,15 @@ class FileType(object):
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)
# ===========================
......
......@@ -4,6 +4,7 @@ import codecs
import inspect
import os
import shutil
import stat
import sys
import textwrap
import tempfile
......@@ -45,14 +46,13 @@ class TempDirMixin(object):
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):
......@@ -1446,17 +1446,19 @@ class TestFileTypeR(TempDirMixin, ParserTestCase):
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', '']
failures = ['-x', '', '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'))),
]
......@@ -1503,11 +1505,15 @@ class WFile(object):
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', '']
failures = ['-x', '', 'readonly']
successes = [
('foo', NS(x=None, spam=WFile('foo'))),
('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
......
......@@ -45,6 +45,8 @@ Library
that for incoming headers which makes this behaviour now consistent in
both incoming and outgoing direction.
- Issue #9509: argparse now properly handles IOErrors raised by
argparse.FileType.
What's New in Python 3.2 Release Candidate 1
============================================
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment