mirror of https://github.com/python/cpython
Merged revisions 70936 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r70936 | r.david.murray | 2009-03-31 23:21:43 -0400 (Tue, 31 Mar 2009) | 4 lines Fix issue 2522. locale.format now checks that it is passed exactly one pattern, which avoids mysterious errors where it had seemed to fail to do localization. ........
This commit is contained in:
parent
12e533d7bf
commit
e59482ec9a
|
@ -11,7 +11,11 @@
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sys, encodings, encodings.aliases
|
import sys
|
||||||
|
import encodings
|
||||||
|
import encodings.aliases
|
||||||
|
import re
|
||||||
|
import collections
|
||||||
from builtins import str as _builtin_str
|
from builtins import str as _builtin_str
|
||||||
import functools
|
import functools
|
||||||
|
|
||||||
|
@ -173,6 +177,9 @@ def _strip_padding(s, amount):
|
||||||
amount -= 1
|
amount -= 1
|
||||||
return s[lpos:rpos+1]
|
return s[lpos:rpos+1]
|
||||||
|
|
||||||
|
_percent_re = re.compile(r'%(?:\((?P<key>.*?)\))?'
|
||||||
|
r'(?P<modifiers>[-#0-9 +*.hlL]*?)[eEfFgGdiouxXcrs%]')
|
||||||
|
|
||||||
def format(percent, value, grouping=False, monetary=False, *additional):
|
def format(percent, value, grouping=False, monetary=False, *additional):
|
||||||
"""Returns the locale-aware substitution of a %? specifier
|
"""Returns the locale-aware substitution of a %? specifier
|
||||||
(percent).
|
(percent).
|
||||||
|
@ -180,9 +187,13 @@ def format(percent, value, grouping=False, monetary=False, *additional):
|
||||||
additional is for format strings which contain one or more
|
additional is for format strings which contain one or more
|
||||||
'*' modifiers."""
|
'*' modifiers."""
|
||||||
# this is only for one-percent-specifier strings and this should be checked
|
# this is only for one-percent-specifier strings and this should be checked
|
||||||
if percent[0] != '%':
|
match = _percent_re.match(percent)
|
||||||
raise ValueError("format() must be given exactly one %char "
|
if not match or len(match.group())!= len(percent):
|
||||||
"format specifier")
|
raise ValueError(("format() must be given exactly one %%char "
|
||||||
|
"format specifier, %s not valid") % repr(percent))
|
||||||
|
return _format(percent, value, grouping, monetary, *additional)
|
||||||
|
|
||||||
|
def _format(percent, value, grouping=False, monetary=False, *additional):
|
||||||
if additional:
|
if additional:
|
||||||
formatted = percent % ((value,) + additional)
|
formatted = percent % ((value,) + additional)
|
||||||
else:
|
else:
|
||||||
|
@ -206,10 +217,6 @@ def format(percent, value, grouping=False, monetary=False, *additional):
|
||||||
formatted = _strip_padding(formatted, seps)
|
formatted = _strip_padding(formatted, seps)
|
||||||
return formatted
|
return formatted
|
||||||
|
|
||||||
import re, collections
|
|
||||||
_percent_re = re.compile(r'%(?:\((?P<key>.*?)\))?'
|
|
||||||
r'(?P<modifiers>[-#0-9 +*.hlL]*?)[eEfFgGdiouxXcrs%]')
|
|
||||||
|
|
||||||
def format_string(f, val, grouping=False):
|
def format_string(f, val, grouping=False):
|
||||||
"""Formats a string in the same way that the % formatting would use,
|
"""Formats a string in the same way that the % formatting would use,
|
||||||
but takes the current locale into account.
|
but takes the current locale into account.
|
||||||
|
|
|
@ -219,6 +219,19 @@ class EnUSNumberFormatting(BaseFormattingTest):
|
||||||
(self.sep, self.sep))
|
(self.sep, self.sep))
|
||||||
|
|
||||||
|
|
||||||
|
class TestFormatPatternArg(unittest.TestCase):
|
||||||
|
# Test handling of pattern argument of format
|
||||||
|
|
||||||
|
def test_onlyOnePattern(self):
|
||||||
|
# Issue 2522: accept exactly one % pattern, and no extra chars.
|
||||||
|
self.assertRaises(ValueError, locale.format, "%f\n", 'foo')
|
||||||
|
self.assertRaises(ValueError, locale.format, "%f\r", 'foo')
|
||||||
|
self.assertRaises(ValueError, locale.format, "%f\r\n", 'foo')
|
||||||
|
self.assertRaises(ValueError, locale.format, " %f", 'foo')
|
||||||
|
self.assertRaises(ValueError, locale.format, "%fg", 'foo')
|
||||||
|
self.assertRaises(ValueError, locale.format, "%^g", 'foo')
|
||||||
|
|
||||||
|
|
||||||
class TestNumberFormatting(BaseLocalizedTest, EnUSNumberFormatting):
|
class TestNumberFormatting(BaseLocalizedTest, EnUSNumberFormatting):
|
||||||
# Test number formatting with a real English locale.
|
# Test number formatting with a real English locale.
|
||||||
|
|
||||||
|
@ -314,6 +327,7 @@ class TestMiscellaneous(unittest.TestCase):
|
||||||
def test_main():
|
def test_main():
|
||||||
tests = [
|
tests = [
|
||||||
TestMiscellaneous,
|
TestMiscellaneous,
|
||||||
|
TestFormatPatternArg,
|
||||||
TestEnUSNumberFormatting,
|
TestEnUSNumberFormatting,
|
||||||
TestCNumberFormatting,
|
TestCNumberFormatting,
|
||||||
TestFrFRNumberFormatting,
|
TestFrFRNumberFormatting,
|
||||||
|
|
|
@ -482,6 +482,7 @@ Damien Miller
|
||||||
Chad Miller
|
Chad Miller
|
||||||
Jay T. Miller
|
Jay T. Miller
|
||||||
Roman Milner
|
Roman Milner
|
||||||
|
Andrii V. Mishkovskyi
|
||||||
Dustin J. Mitchell
|
Dustin J. Mitchell
|
||||||
Dom Mitchell
|
Dom Mitchell
|
||||||
Doug Moen
|
Doug Moen
|
||||||
|
@ -492,6 +493,7 @@ James A Morrison
|
||||||
Sjoerd Mullender
|
Sjoerd Mullender
|
||||||
Sape Mullender
|
Sape Mullender
|
||||||
Michael Muller
|
Michael Muller
|
||||||
|
R. David Murray
|
||||||
Piotr Meyer
|
Piotr Meyer
|
||||||
John Nagle
|
John Nagle
|
||||||
Takahiro Nakayama
|
Takahiro Nakayama
|
||||||
|
|
|
@ -284,6 +284,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #2522: locale.format now checks its first argument to ensure it has
|
||||||
|
been passed only one pattern, avoiding mysterious errors where it appeared
|
||||||
|
that it was failing to do localization.
|
||||||
|
|
||||||
- Issue #5583: Added optional Extensions in Distutils. Initial patch by Georg
|
- Issue #5583: Added optional Extensions in Distutils. Initial patch by Georg
|
||||||
Brandl.
|
Brandl.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue