Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
ac37ba07
Commit
ac37ba07
authored
Aug 14, 2015
by
Robert Collins
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #21159: Improve message in configparser.InterpolationMissingOptionError.
Patch from Łukasz Langa.
parent
4ce4f974
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
21 additions
and
18 deletions
+21
-18
Lib/configparser.py
Lib/configparser.py
+14
-15
Lib/test/test_configparser.py
Lib/test/test_configparser.py
+4
-3
Misc/NEWS
Misc/NEWS
+3
-0
No files found.
Lib/configparser.py
View file @
ac37ba07
...
@@ -241,12 +241,9 @@ class InterpolationMissingOptionError(InterpolationError):
...
@@ -241,12 +241,9 @@ class InterpolationMissingOptionError(InterpolationError):
"""A string substitution required a setting which was not available."""
"""A string substitution required a setting which was not available."""
def
__init__
(
self
,
option
,
section
,
rawval
,
reference
):
def
__init__
(
self
,
option
,
section
,
rawval
,
reference
):
msg
=
(
"Bad value substitution:
\
n
"
msg
=
(
"Bad value substitution: option {!r} in section {!r} contains "
"
\
t
section: [%s]
\
n
"
"an interpolation key {!r} which is not a valid option name. "
"
\
t
option : %s
\
n
"
"Raw value: {!r}"
.
format
(
option
,
section
,
reference
,
rawval
))
"
\
t
key : %s
\
n
"
"
\
t
rawval : %s
\
n
"
%
(
section
,
option
,
reference
,
rawval
))
InterpolationError
.
__init__
(
self
,
option
,
section
,
msg
)
InterpolationError
.
__init__
(
self
,
option
,
section
,
msg
)
self
.
reference
=
reference
self
.
reference
=
reference
self
.
args
=
(
option
,
section
,
rawval
,
reference
)
self
.
args
=
(
option
,
section
,
rawval
,
reference
)
...
@@ -264,11 +261,11 @@ class InterpolationDepthError(InterpolationError):
...
@@ -264,11 +261,11 @@ class InterpolationDepthError(InterpolationError):
"""Raised when substitutions are nested too deeply."""
"""Raised when substitutions are nested too deeply."""
def
__init__
(
self
,
option
,
section
,
rawval
):
def
__init__
(
self
,
option
,
section
,
rawval
):
msg
=
(
"
Value interpolation too deeply recursive:
\
n
"
msg
=
(
"
Recursion limit exceeded in value substitution: option {!r}
"
"
\
t
section: [%s]
\
n
"
"
in section {!r} contains an interpolation key which
"
"
\
t
option : %s
\
n
"
"
cannot be substituted in {} steps. Raw value: {!r}
"
"
\
t
rawval : %s
\
n
"
"
"
.
format
(
option
,
section
,
MAX_INTERPOLATION_DEPTH
,
%
(
section
,
option
,
rawval
))
rawval
))
InterpolationError
.
__init__
(
self
,
option
,
section
,
msg
)
InterpolationError
.
__init__
(
self
,
option
,
section
,
msg
)
self
.
args
=
(
option
,
section
,
rawval
)
self
.
args
=
(
option
,
section
,
rawval
)
...
@@ -384,8 +381,9 @@ class BasicInterpolation(Interpolation):
...
@@ -384,8 +381,9 @@ class BasicInterpolation(Interpolation):
def
_interpolate_some
(
self
,
parser
,
option
,
accum
,
rest
,
section
,
map
,
def
_interpolate_some
(
self
,
parser
,
option
,
accum
,
rest
,
section
,
map
,
depth
):
depth
):
rawval
=
parser
.
get
(
section
,
option
,
raw
=
True
,
fallback
=
rest
)
if
depth
>
MAX_INTERPOLATION_DEPTH
:
if
depth
>
MAX_INTERPOLATION_DEPTH
:
raise
InterpolationDepthError
(
option
,
section
,
r
est
)
raise
InterpolationDepthError
(
option
,
section
,
r
awval
)
while
rest
:
while
rest
:
p
=
rest
.
find
(
"%"
)
p
=
rest
.
find
(
"%"
)
if
p
<
0
:
if
p
<
0
:
...
@@ -410,7 +408,7 @@ class BasicInterpolation(Interpolation):
...
@@ -410,7 +408,7 @@ class BasicInterpolation(Interpolation):
v
=
map
[
var
]
v
=
map
[
var
]
except
KeyError
:
except
KeyError
:
raise
InterpolationMissingOptionError
(
raise
InterpolationMissingOptionError
(
option
,
section
,
r
est
,
var
)
option
,
section
,
r
awval
,
var
)
if
"%"
in
v
:
if
"%"
in
v
:
self
.
_interpolate_some
(
parser
,
option
,
accum
,
v
,
self
.
_interpolate_some
(
parser
,
option
,
accum
,
v
,
section
,
map
,
depth
+
1
)
section
,
map
,
depth
+
1
)
...
@@ -444,8 +442,9 @@ class ExtendedInterpolation(Interpolation):
...
@@ -444,8 +442,9 @@ class ExtendedInterpolation(Interpolation):
def _interpolate_some(self, parser, option, accum, rest, section, map,
def _interpolate_some(self, parser, option, accum, rest, section, map,
depth):
depth):
rawval = parser.get(section, option, raw=True, fallback=rest)
if depth > MAX_INTERPOLATION_DEPTH:
if depth > MAX_INTERPOLATION_DEPTH:
raise InterpolationDepthError(option, section, r
est
)
raise InterpolationDepthError(option, section, r
awval
)
while rest:
while rest:
p = rest.find("
$
")
p = rest.find("
$
")
if p < 0:
if p < 0:
...
@@ -482,7 +481,7 @@ class ExtendedInterpolation(Interpolation):
...
@@ -482,7 +481,7 @@ class ExtendedInterpolation(Interpolation):
"
More
than
one
':'
found
:
%
r" % (rest,))
"
More
than
one
':'
found
:
%
r" % (rest,))
except (KeyError, NoSectionError, NoOptionError):
except (KeyError, NoSectionError, NoOptionError):
raise InterpolationMissingOptionError(
raise InterpolationMissingOptionError(
option, section, r
est
, "
:
".join(path))
option, section, r
awval
, "
:
".join(path))
if "
$
" in v:
if "
$
" in v:
self._interpolate_some(parser, opt, accum, v, sect,
self._interpolate_some(parser, opt, accum, v, sect,
dict(parser.items(sect, raw=True)),
dict(parser.items(sect, raw=True)),
...
...
Lib/test/test_configparser.py
View file @
ac37ba07
...
@@ -847,7 +847,8 @@ class ConfigParserTestCase(BasicTestCase, unittest.TestCase):
...
@@ -847,7 +847,8 @@ class ConfigParserTestCase(BasicTestCase, unittest.TestCase):
"something with lots of interpolation (10 steps)"
)
"something with lots of interpolation (10 steps)"
)
e
=
self
.
get_error
(
cf
,
configparser
.
InterpolationDepthError
,
"Foo"
,
"bar11"
)
e
=
self
.
get_error
(
cf
,
configparser
.
InterpolationDepthError
,
"Foo"
,
"bar11"
)
if
self
.
interpolation
==
configparser
.
_UNSET
:
if
self
.
interpolation
==
configparser
.
_UNSET
:
self
.
assertEqual
(
e
.
args
,
(
"bar11"
,
"Foo"
,
"%(with1)s"
))
self
.
assertEqual
(
e
.
args
,
(
"bar11"
,
"Foo"
,
"something %(with11)s lots of interpolation (11 steps)"
))
elif
isinstance
(
self
.
interpolation
,
configparser
.
LegacyInterpolation
):
elif
isinstance
(
self
.
interpolation
,
configparser
.
LegacyInterpolation
):
self
.
assertEqual
(
e
.
args
,
(
"bar11"
,
"Foo"
,
self
.
assertEqual
(
e
.
args
,
(
"bar11"
,
"Foo"
,
"something %(with11)s lots of interpolation (11 steps)"
))
"something %(with11)s lots of interpolation (11 steps)"
))
...
@@ -861,7 +862,7 @@ class ConfigParserTestCase(BasicTestCase, unittest.TestCase):
...
@@ -861,7 +862,7 @@ class ConfigParserTestCase(BasicTestCase, unittest.TestCase):
self
.
assertEqual
(
e
.
option
,
"name"
)
self
.
assertEqual
(
e
.
option
,
"name"
)
if
self
.
interpolation
==
configparser
.
_UNSET
:
if
self
.
interpolation
==
configparser
.
_UNSET
:
self
.
assertEqual
(
e
.
args
,
(
'name'
,
'Interpolation Error'
,
self
.
assertEqual
(
e
.
args
,
(
'name'
,
'Interpolation Error'
,
''
,
'reference'
))
'
%(reference)s
'
,
'reference'
))
elif
isinstance
(
self
.
interpolation
,
configparser
.
LegacyInterpolation
):
elif
isinstance
(
self
.
interpolation
,
configparser
.
LegacyInterpolation
):
self
.
assertEqual
(
e
.
args
,
(
'name'
,
'Interpolation Error'
,
self
.
assertEqual
(
e
.
args
,
(
'name'
,
'Interpolation Error'
,
'%(reference)s'
,
'reference'
))
'%(reference)s'
,
'reference'
))
...
@@ -1177,7 +1178,7 @@ class ConfigParserTestCaseExtendedInterpolation(BasicTestCase, unittest.TestCase
...
@@ -1177,7 +1178,7 @@ class ConfigParserTestCaseExtendedInterpolation(BasicTestCase, unittest.TestCase
with
self
.
assertRaises
(
exception_class
)
as
cm
:
with
self
.
assertRaises
(
exception_class
)
as
cm
:
cf
[
'interpolated'
][
'$trying'
]
cf
[
'interpolated'
][
'$trying'
]
self
.
assertEqual
(
cm
.
exception
.
reference
,
'dollars:${sick'
)
self
.
assertEqual
(
cm
.
exception
.
reference
,
'dollars:${sick'
)
self
.
assertEqual
(
cm
.
exception
.
args
[
2
],
'}'
)
#rawval
self
.
assertEqual
(
cm
.
exception
.
args
[
2
],
'
${dollars:${sick}
}'
)
#rawval
def
test_case_sensitivity_basic
(
self
):
def
test_case_sensitivity_basic
(
self
):
ini
=
textwrap
.
dedent
(
"""
ini
=
textwrap
.
dedent
(
"""
...
...
Misc/NEWS
View file @
ac37ba07
...
@@ -75,6 +75,9 @@ Core and Builtins
...
@@ -75,6 +75,9 @@ Core and Builtins
Library
Library
-------
-------
-
Issue
#
21159
:
Improve
message
in
configparser
.
InterpolationMissingOptionError
.
Patch
from
Ł
ukasz
Langa
.
-
Issue
#
23888
:
Handle
fractional
time
in
cookie
expiry
.
Patch
by
ssh
.
-
Issue
#
23888
:
Handle
fractional
time
in
cookie
expiry
.
Patch
by
ssh
.
-
Issue
#
23004
:
mock_open
()
now
reads
binary
data
correctly
when
the
type
of
-
Issue
#
23004
:
mock_open
()
now
reads
binary
data
correctly
when
the
type
of
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment