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
@ -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;