Bug #1498146: fix optparse to handle Unicode strings in option help,

description, and epilog.
This commit is contained in:
Greg Ward 2006-06-11 16:24:11 +00:00
parent d1c797e624
commit 0e0c9f4740
3 changed files with 48 additions and 7 deletions

View File

@ -16,7 +16,7 @@ For support, use the optik-users@lists.sourceforge.net mailing list
# Python developers: please do not make changes to this file, since # Python developers: please do not make changes to this file, since
# it is automatically generated from the Optik source code. # it is automatically generated from the Optik source code.
__version__ = "1.5.1" __version__ = "1.5.1+"
__all__ = ['Option', __all__ = ['Option',
'SUPPRESS_HELP', 'SUPPRESS_HELP',
@ -75,8 +75,8 @@ def _repr(self):
# This file was generated from: # This file was generated from:
# Id: option_parser.py 509 2006-04-20 00:58:24Z gward # Id: option_parser.py 522 2006-06-11 16:22:03Z gward
# Id: option.py 509 2006-04-20 00:58:24Z gward # Id: option.py 522 2006-06-11 16:22:03Z gward
# Id: help.py 509 2006-04-20 00:58:24Z gward # Id: help.py 509 2006-04-20 00:58:24Z gward
# Id: errors.py 509 2006-04-20 00:58:24Z gward # Id: errors.py 509 2006-04-20 00:58:24Z gward
@ -256,7 +256,7 @@ class HelpFormatter:
text_width, text_width,
initial_indent=indent, initial_indent=indent,
subsequent_indent=indent) subsequent_indent=indent)
def format_description(self, description): def format_description(self, description):
if description: if description:
return self._format_text(description) + "\n" return self._format_text(description) + "\n"
@ -1214,7 +1214,7 @@ class OptionParser (OptionContainer):
""" """
Declare that you are done with this OptionParser. This cleans up Declare that you are done with this OptionParser. This cleans up
reference cycles so the OptionParser (and all objects referenced by reference cycles so the OptionParser (and all objects referenced by
it) can be garbage-collected promptly. After calling destroy(), the it) can be garbage-collected promptly. After calling destroy(), the
OptionParser is unusable. OptionParser is unusable.
""" """
OptionContainer.destroy(self) OptionContainer.destroy(self)
@ -1629,6 +1629,10 @@ class OptionParser (OptionContainer):
result.append(self.format_epilog(formatter)) result.append(self.format_epilog(formatter))
return "".join(result) return "".join(result)
# used by test suite
def _get_encoding(self, file):
return getattr(file, "encoding", sys.getdefaultencoding())
def print_help(self, file=None): def print_help(self, file=None):
"""print_help(file : file = stdout) """print_help(file : file = stdout)
@ -1637,7 +1641,8 @@ class OptionParser (OptionContainer):
""" """
if file is None: if file is None:
file = sys.stdout file = sys.stdout
file.write(self.format_help()) encoding = self._get_encoding(file)
file.write(self.format_help().encode(encoding, "replace"))
# class OptionParser # class OptionParser

View File

@ -15,7 +15,7 @@ import copy
import types import types
import unittest import unittest
from cStringIO import StringIO from StringIO import StringIO
from pprint import pprint from pprint import pprint
from test import test_support from test import test_support
@ -164,15 +164,23 @@ and kwargs %(kwargs)r
expected_error=None): expected_error=None):
"""Assert the parser prints the expected output on stdout.""" """Assert the parser prints the expected output on stdout."""
save_stdout = sys.stdout save_stdout = sys.stdout
encoding = getattr(save_stdout, 'encoding', None)
try: try:
try: try:
sys.stdout = StringIO() sys.stdout = StringIO()
if encoding:
sys.stdout.encoding = encoding
self.parser.parse_args(cmdline_args) self.parser.parse_args(cmdline_args)
finally: finally:
output = sys.stdout.getvalue() output = sys.stdout.getvalue()
sys.stdout = save_stdout sys.stdout = save_stdout
except InterceptedError, err: except InterceptedError, err:
self.assert_(
type(output) is types.StringType,
"expected output to be an ordinary string, not %r"
% type(output))
if output != expected_output: if output != expected_output:
self.fail("expected: \n'''\n" + expected_output + self.fail("expected: \n'''\n" + expected_output +
"'''\nbut got \n'''\n" + output + "'''") "'''\nbut got \n'''\n" + output + "'''")
@ -1456,6 +1464,10 @@ class TestHelp(BaseTest):
return InterceptingOptionParser(option_list=options) return InterceptingOptionParser(option_list=options)
def assertHelpEquals(self, expected_output): def assertHelpEquals(self, expected_output):
if type(expected_output) is types.UnicodeType:
encoding = self.parser._get_encoding(sys.stdout)
expected_output = expected_output.encode(encoding, "replace")
save_argv = sys.argv[:] save_argv = sys.argv[:]
try: try:
# Make optparse believe bar.py is being executed. # Make optparse believe bar.py is being executed.
@ -1486,6 +1498,27 @@ class TestHelp(BaseTest):
self.parser = self.make_parser(60) self.parser = self.make_parser(60)
self.assertHelpEquals(_expected_help_short_lines) self.assertHelpEquals(_expected_help_short_lines)
def test_help_unicode(self):
self.parser = InterceptingOptionParser(usage=SUPPRESS_USAGE)
self.parser.add_option("-a", action="store_true", help=u"ol\u00E9!")
expect = u"""\
Options:
-h, --help show this help message and exit
-a ol\u00E9!
"""
self.assertHelpEquals(expect)
def test_help_unicode_description(self):
self.parser = InterceptingOptionParser(usage=SUPPRESS_USAGE,
description=u"ol\u00E9!")
expect = u"""\
ol\u00E9!
Options:
-h, --help show this help message and exit
"""
self.assertHelpEquals(expect)
def test_help_description_groups(self): def test_help_description_groups(self):
self.parser.set_description( self.parser.set_description(
"This is the program description for %prog. %prog has " "This is the program description for %prog. %prog has "

View File

@ -145,6 +145,9 @@ Extension Modules
Library Library
------- -------
- Bug #1498146: fix optparse to handle Unicode strings in option help,
description, and epilog.
- Bug #1366250: minor optparse documentation error. - Bug #1366250: minor optparse documentation error.
- Bug #1361643: fix textwrap.dedent() so it handles tabs appropriately; - Bug #1361643: fix textwrap.dedent() so it handles tabs appropriately;