Bug #1498146: fix optparse to handle Unicode strings in option help,
description, and epilog.
This commit is contained in:
parent
d1c797e624
commit
0e0c9f4740
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 "
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue