From: David G. <go...@py...> - 2012-01-26 14:18:09
|
Günter, please have more patience. Especially with a controversial change like this, still in mid-discussion, please wait until the issues have been resolved before committing changes. Alternatively, start a branch for the changes. That's what branches are for. I am preparing a response on the other thread. In the meantime, please revert this change. Feel free to start a branch though. The trunk is not the place to have a discussion. Thanks, David On Thu, Jan 26, 2012 at 08:38, <mi...@us...> wrote: > Revision: 7326 > http://docutils.svn.sourceforge.net/docutils/?rev=7326&view=rev > Author: milde > Date: 2012-01-26 13:38:54 +0000 (Thu, 26 Jan 2012) > Log Message: > ----------- > io.FileInput/io.FileOutput: No system-exit on IOError. > > Allows handling by core.Publisher or a calling application. > > Modified Paths: > -------------- > trunk/docutils/HISTORY.txt > trunk/docutils/docutils/core.py > trunk/docutils/docutils/io.py > trunk/docutils/docutils/parsers/rst/directives/misc.py > trunk/docutils/docutils/parsers/rst/directives/tables.py > trunk/docutils/docutils/writers/html4css1/__init__.py > trunk/docutils/docutils/writers/latex2e/__init__.py > trunk/docutils/test/test_parsers/test_rst/test_directives/test_include.py > trunk/docutils/test/test_parsers/test_rst/test_directives/test_raw.py > > Modified: trunk/docutils/HISTORY.txt > =================================================================== > --- trunk/docutils/HISTORY.txt 2012-01-26 13:08:04 UTC (rev 7325) > +++ trunk/docutils/HISTORY.txt 2012-01-26 13:38:54 UTC (rev 7326) > @@ -29,9 +29,18 @@ > - Fix [ 2971827 ] and [ 3442827 ] > extras/roman.py moved to docutils/utils/roman.py > > +* docutils/core.py: > + > + - Catch and report InputError/OutputError > + (unless the configuration setting "traceback" is true). > + > * docutils/io.py > > - Fix [ 3395948 ] (Work around encoding problems in Py3k). > + - FileInput/FileOutput: No system-exit on IOError. > + Instead, the custom exceptions InputError/OutputError are raised > + to allow handling by core.Publisher or a calling application. > + The optional argument `handle_io_errors` (to be removed later) is ignored. > > * docutils/utils.py -> docutils/utils/__init__.py > > > Modified: trunk/docutils/docutils/core.py > =================================================================== > --- trunk/docutils/docutils/core.py 2012-01-26 13:08:04 UTC (rev 7325) > +++ trunk/docutils/docutils/core.py 2012-01-26 13:38:54 UTC (rev 7326) > @@ -135,7 +135,7 @@ > if self.settings is None: > defaults = (settings_overrides or {}).copy() > # Propagate exceptions by default when used programmatically: > - defaults.setdefault('traceback', 1) > + defaults.setdefault('traceback', True) > self.get_settings(settings_spec=settings_spec, > config_section=config_section, > **defaults) > @@ -221,7 +221,7 @@ > self.debugging_dumps() > raise > self.report_Exception(error) > - exit = 1 > + exit = True > exit_status = 1 > self.debugging_dumps() > if (enable_exit_status and self.document > @@ -260,6 +260,10 @@ > self.report_SystemMessage(error) > elif isinstance(error, UnicodeEncodeError): > self.report_UnicodeError(error) > + elif isinstance(error, io.InputError): > + self.report_InputError(error) > + elif isinstance(error, io.OutputError): > + self.report_OutputError(error) > else: > print >>self._stderr, u'%s' % ErrorString(error) > print >>self._stderr, ("""\ > @@ -275,6 +279,14 @@ > % (error.level, > utils.Reporter.levels[error.level])) > > + def report_InputError(self, error): > + self._stderr.write(u'Unable to open source file for reading:\n' > + u' %s\n' % ErrorString(error)) > + > + def report_OutputError(self, error): > + self._stderr.write(u'Unable to open destination file for writing:\n' > + u' %s\n' % ErrorString(error)) > + > def report_UnicodeError(self, error): > data = error.object[error.start:error.end] > self._stderr.write( > > Modified: trunk/docutils/docutils/io.py > =================================================================== > --- trunk/docutils/docutils/io.py 2012-01-26 13:08:04 UTC (rev 7325) > +++ trunk/docutils/docutils/io.py 2012-01-26 13:38:54 UTC (rev 7326) > @@ -17,6 +17,11 @@ > from docutils._compat import b > from docutils.error_reporting import locale_encoding, ErrorString, ErrorOutput > > + > +class InputError(IOError): pass > +class OutputError(IOError): pass > + > + > class Input(TransformSpec): > > """ > @@ -184,7 +189,7 @@ > """ > def __init__(self, source=None, source_path=None, > encoding=None, error_handler='strict', > - autoclose=True, handle_io_errors=True, mode='rU'): > + autoclose=True, handle_io_errors=False, mode='rU'): > """ > :Parameters: > - `source`: either a file-like object (which is read directly), or > @@ -194,7 +199,7 @@ > - `error_handler`: the encoding error handler to use. > - `autoclose`: close automatically after read (except when > `sys.stdin` is the source). > - - `handle_io_errors`: summarize I/O errors here, and exit? > + - `handle_io_errors`: ignored. > - `mode`: how the file is to be opened (see standard function > `open`). The default 'rU' provides universal newline support > for text files. > @@ -216,12 +221,7 @@ > try: > self.source = open(source_path, mode, **kwargs) > except IOError, error: > - if not handle_io_errors: > - raise > - print >>self._stderr, ErrorString(error) > - print >>self._stderr, (u'Unable to open source' > - u" file for reading ('%s'). Exiting." % source_path) > - sys.exit(1) > + raise InputError(error.errno, error.strerror, source_path) > else: > self.source = sys.stdin > elif (sys.version_info >= (3,0) and > @@ -286,7 +286,7 @@ > > def __init__(self, destination=None, destination_path=None, > encoding=None, error_handler='strict', autoclose=True, > - handle_io_errors=True): > + handle_io_errors=False): > """ > :Parameters: > - `destination`: either a file-like object (which is written > @@ -294,8 +294,11 @@ > `destination_path` given). > - `destination_path`: a path to a file, which is opened and then > written. > + - `encoding`: the text encoding of the output file. > + - `error_handler`: the encoding error handler to use. > - `autoclose`: close automatically after write (except when > `sys.stdout` or `sys.stderr` is the destination). > + - `handle_io_errors`: ignored. > """ > Output.__init__(self, destination, destination_path, > encoding, error_handler) > @@ -326,12 +329,8 @@ > try: > self.destination = open(self.destination_path, 'w', **kwargs) > except IOError, error: > - if not self.handle_io_errors: > - raise > - print >>self._stderr, ErrorString(error) > - print >>self._stderr, (u'Unable to open destination file' > - u" for writing ('%s'). Exiting." % self.destination_path) > - sys.exit(1) > + raise OutputError(error.errno, error.strerror, > + self.destination_path) > self.opened = True > > def write(self, data): > > Modified: trunk/docutils/docutils/parsers/rst/directives/misc.py > =================================================================== > --- trunk/docutils/docutils/parsers/rst/directives/misc.py 2012-01-26 13:08:04 UTC (rev 7325) > +++ trunk/docutils/docutils/parsers/rst/directives/misc.py 2012-01-26 13:38:54 UTC (rev 7326) > @@ -69,10 +69,10 @@ > try: > self.state.document.settings.record_dependencies.add(path) > include_file = io.FileInput( > - source_path=path, encoding=encoding, > - error_handler=(self.state.document.settings.\ > - input_encoding_error_handler), > - handle_io_errors=None) > + source_path=path, > + encoding=encoding, > + error_handler= > + self.state.document.settings.input_encoding_error_handler) > except IOError, error: > raise self.severe(u'Problems with "%s" directive path:\n%s.' % > (self.name, ErrorString(error))) > @@ -198,11 +198,10 @@ > self.options['file'])) > path = utils.relative_path(None, path) > try: > - raw_file = io.FileInput( > - source_path=path, encoding=encoding, > - error_handler=(self.state.document.settings.\ > - input_encoding_error_handler), > - handle_io_errors=None) > + eh = self.state.document.settings.input_encoding_error_handler > + raw_file = io.FileInput(source_path=path, > + encoding=encoding, > + error_handler=eh) > # TODO: currently, raw input files are recorded as > # dependencies even if not used for the chosen output format. > self.state.document.settings.record_dependencies.add(path) > > Modified: trunk/docutils/docutils/parsers/rst/directives/tables.py > =================================================================== > --- trunk/docutils/docutils/parsers/rst/directives/tables.py 2012-01-26 13:08:04 UTC (rev 7325) > +++ trunk/docutils/docutils/parsers/rst/directives/tables.py 2012-01-26 13:38:54 UTC (rev 7326) > @@ -271,10 +271,10 @@ > try: > self.state.document.settings.record_dependencies.add(source) > csv_file = io.FileInput( > - source_path=source, encoding=encoding, > - error_handler=(self.state.document.settings.\ > - input_encoding_error_handler), > - handle_io_errors=None) > + source_path=source, > + encoding=encoding, > + error_handler= > + self.state.document.settings.input_encoding_error_handler) > csv_data = csv_file.read().splitlines() > except IOError, error: > severe = self.state_machine.reporter.severe( > > Modified: trunk/docutils/docutils/writers/html4css1/__init__.py > =================================================================== > --- trunk/docutils/docutils/writers/html4css1/__init__.py 2012-01-26 13:08:04 UTC (rev 7325) > +++ trunk/docutils/docutils/writers/html4css1/__init__.py 2012-01-26 13:38:54 UTC (rev 7326) > @@ -373,8 +373,7 @@ > if self.settings.embed_stylesheet: > try: > content = io.FileInput(source_path=path, > - encoding='utf-8', > - handle_io_errors=False).read() > + encoding='utf-8').read() > self.settings.record_dependencies.add(path) > except IOError, err: > msg = u"Cannot embed stylesheet '%s': %s." % ( > > Modified: trunk/docutils/docutils/writers/latex2e/__init__.py > =================================================================== > --- trunk/docutils/docutils/writers/latex2e/__init__.py 2012-01-26 13:08:04 UTC (rev 7325) > +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2012-01-26 13:38:54 UTC (rev 7326) > @@ -1179,8 +1179,7 @@ > path = base + '.sty' # ensure extension > try: > content = io.FileInput(source_path=path, > - encoding='utf-8', > - handle_io_errors=False).read() > + encoding='utf-8').read() > self.settings.record_dependencies.add(path) > except IOError, err: > msg = u"Cannot embed stylesheet '%s':\n %s." % ( > > Modified: trunk/docutils/test/test_parsers/test_rst/test_directives/test_include.py > =================================================================== > --- trunk/docutils/test/test_parsers/test_rst/test_directives/test_include.py 2012-01-26 13:08:04 UTC (rev 7325) > +++ trunk/docutils/test/test_parsers/test_rst/test_directives/test_include.py 2012-01-26 13:38:54 UTC (rev 7326) > @@ -212,7 +212,7 @@ > <system_message level="4" line="4" source="test data" type="SEVERE"> > <paragraph> > Problems with "include" directive path: > - IOError: [Errno 2] No such file or directory: 'nonexistent.txt'. > + InputError: [Errno 2] No such file or directory: 'nonexistent.txt'. > <literal_block xml:space="preserve"> > .. include:: nonexistent.txt > <paragraph> > @@ -414,7 +414,7 @@ > <system_message level="4" line="3" source="test data" type="SEVERE"> > <paragraph> > Problems with "include" directive path: > - IOError: [Errno 2] No such file or directory: '\u043c\u0438\u0440.txt'. > + InputError: [Errno 2] No such file or directory: '\u043c\u0438\u0440.txt'. > <literal_block xml:space="preserve"> > .. include:: \u043c\u0438\u0440.txt > """], > @@ -458,7 +458,7 @@ > <system_message level="4" line="12" source="%(source)s" type="SEVERE"> > <paragraph> > Problems with "include" directive path: > - IOError: [Errno 2] No such file or directory: '%(nonexistent)s'. > + InputError: [Errno 2] No such file or directory: '%(nonexistent)s'. > <literal_block xml:space="preserve"> > .. include:: <nonexistent> > <system_message level="3" line="14" source="%(source)s" type="ERROR"> > @@ -697,7 +697,7 @@ > <system_message level="4" line="3" source="test data" type="SEVERE"> > <paragraph> > Problems with "include" directive path: > - IOError: [Errno 2] No such file or directory: '%s'. > + InputError: [Errno 2] No such file or directory: '%s'. > <literal_block xml:space="preserve"> > .. include:: <nonexistent> > """ % nonexistent_rel], > > Modified: trunk/docutils/test/test_parsers/test_rst/test_directives/test_raw.py > =================================================================== > --- trunk/docutils/test/test_parsers/test_rst/test_directives/test_raw.py 2012-01-26 13:08:04 UTC (rev 7325) > +++ trunk/docutils/test/test_parsers/test_rst/test_directives/test_raw.py 2012-01-26 13:38:54 UTC (rev 7326) > @@ -158,7 +158,7 @@ > <system_message level="4" line="1" source="test data" type="SEVERE"> > <paragraph> > Problems with "raw" directive path: > - IOError: [Errno 2] No such file or directory: 'non-existent.file'. > + InputError: [Errno 2] No such file or directory: 'non-existent.file'. > <literal_block xml:space="preserve"> > .. raw:: html > :file: non-existent.file |