mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-29 03:04:38 +08:00
Merge pull request #5172 from Blues-star/main
Update `configparser.py` and `test_configparser.py` from CPython v3.12
This commit is contained in:
2 files changed
+13
-96
No files matched your search
Vendored
+6
-57
@@ -59,7 +59,7 @@ ConfigParser -- responsible for parsing a list of
|
||||
instance. It will be used as the handler for option value
|
||||
pre-processing when using getters. RawConfigParser objects don't do
|
||||
any sort of interpolation, whereas ConfigParser uses an instance of
|
||||
BasicInterpolation. The library also provides a ``zc.buildbot``
|
||||
BasicInterpolation. The library also provides a ``zc.buildout``
|
||||
inspired ExtendedInterpolation implementation.
|
||||
|
||||
When `converters` is given, it should be a dictionary where each key
|
||||
@@ -149,14 +149,14 @@ import re
|
||||
import sys
|
||||
import warnings
|
||||
|
||||
__all__ = ["NoSectionError", "DuplicateOptionError", "DuplicateSectionError",
|
||||
__all__ = ("NoSectionError", "DuplicateOptionError", "DuplicateSectionError",
|
||||
"NoOptionError", "InterpolationError", "InterpolationDepthError",
|
||||
"InterpolationMissingOptionError", "InterpolationSyntaxError",
|
||||
"ParsingError", "MissingSectionHeaderError",
|
||||
"ConfigParser", "SafeConfigParser", "RawConfigParser",
|
||||
"ConfigParser", "RawConfigParser",
|
||||
"Interpolation", "BasicInterpolation", "ExtendedInterpolation",
|
||||
"LegacyInterpolation", "SectionProxy", "ConverterMapping",
|
||||
"DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"]
|
||||
"DEFAULTSECT", "MAX_INTERPOLATION_DEPTH")
|
||||
|
||||
_default_dict = dict
|
||||
DEFAULTSECT = "DEFAULT"
|
||||
@@ -298,41 +298,12 @@ class InterpolationDepthError(InterpolationError):
|
||||
class ParsingError(Error):
|
||||
"""Raised when a configuration file does not follow legal syntax."""
|
||||
|
||||
def __init__(self, source=None, filename=None):
|
||||
# Exactly one of `source'/`filename' arguments has to be given.
|
||||
# `filename' kept for compatibility.
|
||||
if filename and source:
|
||||
raise ValueError("Cannot specify both `filename' and `source'. "
|
||||
"Use `source'.")
|
||||
elif not filename and not source:
|
||||
raise ValueError("Required argument `source' not given.")
|
||||
elif filename:
|
||||
source = filename
|
||||
Error.__init__(self, 'Source contains parsing errors: %r' % source)
|
||||
def __init__(self, source):
|
||||
super().__init__(f'Source contains parsing errors: {source!r}')
|
||||
self.source = source
|
||||
self.errors = []
|
||||
self.args = (source, )
|
||||
|
||||
@property
|
||||
def filename(self):
|
||||
"""Deprecated, use `source'."""
|
||||
warnings.warn(
|
||||
"The 'filename' attribute will be removed in Python 3.12. "
|
||||
"Use 'source' instead.",
|
||||
DeprecationWarning, stacklevel=2
|
||||
)
|
||||
return self.source
|
||||
|
||||
@filename.setter
|
||||
def filename(self, value):
|
||||
"""Deprecated, user `source'."""
|
||||
warnings.warn(
|
||||
"The 'filename' attribute will be removed in Python 3.12. "
|
||||
"Use 'source' instead.",
|
||||
DeprecationWarning, stacklevel=2
|
||||
)
|
||||
self.source = value
|
||||
|
||||
def append(self, lineno, line):
|
||||
self.errors.append((lineno, line))
|
||||
self.message += '\n\t[line %2d]: %s' % (lineno, line)
|
||||
@@ -769,15 +740,6 @@ class RawConfigParser(MutableMapping):
|
||||
elements_added.add((section, key))
|
||||
self.set(section, key, value)
|
||||
|
||||
def readfp(self, fp, filename=None):
|
||||
"""Deprecated, use read_file instead."""
|
||||
warnings.warn(
|
||||
"This method will be removed in Python 3.12. "
|
||||
"Use 'parser.read_file()' instead.",
|
||||
DeprecationWarning, stacklevel=2
|
||||
)
|
||||
self.read_file(fp, source=filename)
|
||||
|
||||
def get(self, section, option, *, raw=False, vars=None, fallback=_UNSET):
|
||||
"""Get an option value for a given section.
|
||||
|
||||
@@ -1240,19 +1202,6 @@ class ConfigParser(RawConfigParser):
|
||||
self._interpolation = hold_interpolation
|
||||
|
||||
|
||||
class SafeConfigParser(ConfigParser):
|
||||
"""ConfigParser alias for backwards compatibility purposes."""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
warnings.warn(
|
||||
"The SafeConfigParser class has been renamed to ConfigParser "
|
||||
"in Python 3.2. This alias will be removed in Python 3.12."
|
||||
" Use ConfigParser directly instead.",
|
||||
DeprecationWarning, stacklevel=2
|
||||
)
|
||||
|
||||
|
||||
class SectionProxy(MutableMapping):
|
||||
"""A proxy for a single section from a parser."""
|
||||
|
||||
|
||||
Vendored
+7
-39
@@ -114,7 +114,7 @@ class BasicTestCase(CfgParserTestCaseClass):
|
||||
|
||||
# The use of spaces in the section names serves as a
|
||||
# regression test for SourceForge bug #583248:
|
||||
# http://www.python.org/sf/583248
|
||||
# https://bugs.python.org/issue583248
|
||||
|
||||
# API access
|
||||
eq(cf.get('Foo Bar', 'foo'), 'bar1')
|
||||
@@ -934,7 +934,7 @@ class ConfigParserTestCase(BasicTestCase, unittest.TestCase):
|
||||
('name', 'value')])
|
||||
|
||||
def test_safe_interpolation(self):
|
||||
# See http://www.python.org/sf/511737
|
||||
# See https://bugs.python.org/issue511737
|
||||
cf = self.fromstring("[section]\n"
|
||||
"option1{eq}xxx\n"
|
||||
"option2{eq}%(option1)s/xxx\n"
|
||||
@@ -1614,23 +1614,12 @@ class CoverageOneHundredTestCase(unittest.TestCase):
|
||||
self.assertEqual(error.section, 'section')
|
||||
|
||||
def test_parsing_error(self):
|
||||
with self.assertRaises(ValueError) as cm:
|
||||
with self.assertRaises(TypeError) as cm:
|
||||
configparser.ParsingError()
|
||||
self.assertEqual(str(cm.exception), "Required argument `source' not "
|
||||
"given.")
|
||||
with self.assertRaises(ValueError) as cm:
|
||||
configparser.ParsingError(source='source', filename='filename')
|
||||
self.assertEqual(str(cm.exception), "Cannot specify both `filename' "
|
||||
"and `source'. Use `source'.")
|
||||
error = configparser.ParsingError(filename='source')
|
||||
error = configparser.ParsingError(source='source')
|
||||
self.assertEqual(error.source, 'source')
|
||||
error = configparser.ParsingError('source')
|
||||
self.assertEqual(error.source, 'source')
|
||||
with warnings.catch_warnings(record=True) as w:
|
||||
warnings.simplefilter("always", DeprecationWarning)
|
||||
self.assertEqual(error.filename, 'source')
|
||||
error.filename = 'filename'
|
||||
self.assertEqual(error.source, 'filename')
|
||||
for warning in w:
|
||||
self.assertTrue(warning.category is DeprecationWarning)
|
||||
|
||||
def test_interpolation_validation(self):
|
||||
parser = configparser.ConfigParser()
|
||||
@@ -1649,27 +1638,6 @@ class CoverageOneHundredTestCase(unittest.TestCase):
|
||||
self.assertEqual(str(cm.exception), "bad interpolation variable "
|
||||
"reference '%(()'")
|
||||
|
||||
def test_readfp_deprecation(self):
|
||||
sio = io.StringIO("""
|
||||
[section]
|
||||
option = value
|
||||
""")
|
||||
parser = configparser.ConfigParser()
|
||||
with warnings.catch_warnings(record=True) as w:
|
||||
warnings.simplefilter("always", DeprecationWarning)
|
||||
parser.readfp(sio, filename='StringIO')
|
||||
for warning in w:
|
||||
self.assertTrue(warning.category is DeprecationWarning)
|
||||
self.assertEqual(len(parser), 2)
|
||||
self.assertEqual(parser['section']['option'], 'value')
|
||||
|
||||
def test_safeconfigparser_deprecation(self):
|
||||
with warnings.catch_warnings(record=True) as w:
|
||||
warnings.simplefilter("always", DeprecationWarning)
|
||||
parser = configparser.SafeConfigParser()
|
||||
for warning in w:
|
||||
self.assertTrue(warning.category is DeprecationWarning)
|
||||
|
||||
def test_legacyinterpolation_deprecation(self):
|
||||
with warnings.catch_warnings(record=True) as w:
|
||||
warnings.simplefilter("always", DeprecationWarning)
|
||||
@@ -1843,7 +1811,7 @@ class ExceptionPicklingTestCase(unittest.TestCase):
|
||||
self.assertEqual(e1.source, e2.source)
|
||||
self.assertEqual(e1.errors, e2.errors)
|
||||
self.assertEqual(repr(e1), repr(e2))
|
||||
e1 = configparser.ParsingError(filename='filename')
|
||||
e1 = configparser.ParsingError('filename')
|
||||
e1.append(1, 'line1')
|
||||
e1.append(2, 'line2')
|
||||
e1.append(3, 'line3')
|
||||
|
||||
Reference in new issue
Block a user