Commit 392c6fc0 authored by Georg Brandl's avatar Georg Brandl

ConfigParser renaming reversal part 3: move module into place and adapt imports.

parent 995ee9da
:mod:`configparser` --- Configuration file parser :mod:`ConfigParser` --- Configuration file parser
================================================= =================================================
.. module:: ConfigParser .. module:: ConfigParser
:synopsis: Old name for the configparser module.
.. module:: configparser
:synopsis: Configuration file parser. :synopsis: Configuration file parser.
.. moduleauthor:: Ken Manheimer <klm@zope.com> .. moduleauthor:: Ken Manheimer <klm@zope.com>
...@@ -13,9 +10,10 @@ ...@@ -13,9 +10,10 @@
.. sectionauthor:: Christopher G. Petrilli <petrilli@amber.org> .. sectionauthor:: Christopher G. Petrilli <petrilli@amber.org>
.. note:: .. note::
The :mod:`ConfigParser` module has been renamed to :mod:`configparser` in
Python 3.0. It is importable under both names in Python 2.6 and the rest of The :mod:`ConfigParser` module has been renamed to `configparser` in Python
the 2.x series. 3.0. The :term:`2to3` tool will automatically adapt imports when converting
your sources to 3.0.
.. index:: .. index::
pair: .ini; file pair: .ini; file
...@@ -233,9 +231,9 @@ RawConfigParser Objects ...@@ -233,9 +231,9 @@ RawConfigParser Objects
load the required file or files using :meth:`readfp` before calling :meth:`read` load the required file or files using :meth:`readfp` before calling :meth:`read`
for any optional files:: for any optional files::
import configparser, os import ConfigParser, os
config = configparser.ConfigParser() config = ConfigParser.ConfigParser()
config.readfp(open('defaults.cfg')) config.readfp(open('defaults.cfg'))
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')]) config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')])
...@@ -375,10 +373,10 @@ Examples ...@@ -375,10 +373,10 @@ Examples
An example of writing to a configuration file:: An example of writing to a configuration file::
import configparser import ConfigParser
config = ConfigParser.RawConfigParser()
config = configparser.RawConfigParser()
# When adding sections or items, add them in the reverse order of # When adding sections or items, add them in the reverse order of
# how you want them to be displayed in the actual file. # how you want them to be displayed in the actual file.
# In addition, please note that using RawConfigParser's and the raw # In addition, please note that using RawConfigParser's and the raw
...@@ -393,16 +391,16 @@ An example of writing to a configuration file:: ...@@ -393,16 +391,16 @@ An example of writing to a configuration file::
config.set('Section1', 'baz', 'fun') config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python') config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!') config.set('Section1', 'foo', '%(bar)s is %(baz)s!')
# Writing our configuration file to 'example.cfg' # Writing our configuration file to 'example.cfg'
with open('example.cfg', 'wb') as configfile: with open('example.cfg', 'wb') as configfile:
config.write(configfile) config.write(configfile)
An example of reading the configuration file again:: An example of reading the configuration file again::
import configparser import ConfigParser
config = configparser.RawConfigParser() config = ConfigParser.RawConfigParser()
config.read('example.cfg') config.read('example.cfg')
# getfloat() raises an exception if the value is not a float # getfloat() raises an exception if the value is not a float
...@@ -419,9 +417,9 @@ An example of reading the configuration file again:: ...@@ -419,9 +417,9 @@ An example of reading the configuration file again::
To get interpolation, you will need to use a :class:`ConfigParser` or To get interpolation, you will need to use a :class:`ConfigParser` or
:class:`SafeConfigParser`:: :class:`SafeConfigParser`::
import configparser import ConfigParser
config = configparser.ConfigParser() config = ConfigParser.ConfigParser()
config.read('example.cfg') config.read('example.cfg')
# Set the third, optional argument of get to 1 if you wish to use raw mode. # Set the third, optional argument of get to 1 if you wish to use raw mode.
...@@ -433,15 +431,15 @@ To get interpolation, you will need to use a :class:`ConfigParser` or ...@@ -433,15 +431,15 @@ To get interpolation, you will need to use a :class:`ConfigParser` or
print config.get('Section1', 'foo', 0, {'bar': 'Documentation', print config.get('Section1', 'foo', 0, {'bar': 'Documentation',
'baz': 'evil'}) 'baz': 'evil'})
Defaults are available in all three types of ConfigParsers. They are used in Defaults are available in all three types of ConfigParsers. They are used in
interpolation if an option used is not defined elsewhere. :: interpolation if an option used is not defined elsewhere. ::
import configparser import ConfigParser
# New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each # New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each
config = configparser.SafeConfigParser({'bar': 'Life', 'baz': 'hard'}) config = ConfigParser.SafeConfigParser({'bar': 'Life', 'baz': 'hard'})
config.read('example.cfg') config.read('example.cfg')
print config.get('Section1', 'foo') # -> "Python is fun!" print config.get('Section1', 'foo') # -> "Python is fun!"
config.remove_option('Section1', 'bar') config.remove_option('Section1', 'bar')
config.remove_option('Section1', 'baz') config.remove_option('Section1', 'baz')
...@@ -452,7 +450,7 @@ The function ``opt_move`` below can be used to move options between sections:: ...@@ -452,7 +450,7 @@ The function ``opt_move`` below can be used to move options between sections::
def opt_move(config, section1, section2, option): def opt_move(config, section1, section2, option):
try: try:
config.set(section2, option, config.get(section1, option, 1)) config.set(section2, option, config.get(section1, option, 1))
except configparser.NoSectionError: except ConfigParser.NoSectionError:
# Create non-existent section # Create non-existent section
config.add_section(section2) config.add_section(section2)
opt_move(config, section1, section2, option) opt_move(config, section1, section2, option)
......
...@@ -2240,12 +2240,12 @@ in :mod:`logging` itself) and defining handlers which are declared either in ...@@ -2240,12 +2240,12 @@ in :mod:`logging` itself) and defining handlers which are declared either in
.. function:: fileConfig(fname[, defaults]) .. function:: fileConfig(fname[, defaults])
Reads the logging configuration from a :mod:`configparser`\-format file named Reads the logging configuration from a ConfigParser-format file named *fname*.
*fname*. This function can be called several times from an application, This function can be called several times from an application, allowing an end
allowing an end user the ability to select from various pre-canned user the ability to select from various pre-canned configurations (if the
configurations (if the developer provides a mechanism to present the choices developer provides a mechanism to present the choices and load the chosen
and load the chosen configuration). Defaults to be passed to the ConfigParser configuration). Defaults to be passed to ConfigParser can be specified in the
can be specified in the *defaults* argument. *defaults* argument.
.. function:: listen([port]) .. function:: listen([port])
...@@ -2275,20 +2275,18 @@ in :mod:`logging` itself) and defining handlers which are declared either in ...@@ -2275,20 +2275,18 @@ in :mod:`logging` itself) and defining handlers which are declared either in
Configuration file format Configuration file format
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
The configuration file format understood by :func:`fileConfig` is The configuration file format understood by :func:`fileConfig` is based on
based on :mod:`configparser` functionality. The file must contain ConfigParser functionality. The file must contain sections called ``[loggers]``,
sections called ``[loggers]``, ``[handlers]`` and ``[formatters]`` ``[handlers]`` and ``[formatters]`` which identify by name the entities of each
which identify by name the entities of each type which are defined in type which are defined in the file. For each such entity, there is a separate
the file. For each such entity, there is a separate section which section which identified how that entity is configured. Thus, for a logger named
identified how that entity is configured. Thus, for a logger named ``log01`` in the ``[loggers]`` section, the relevant configuration details are
``log01`` in the ``[loggers]`` section, the relevant configuration held in a section ``[logger_log01]``. Similarly, a handler called ``hand01`` in
details are held in a section ``[logger_log01]``. Similarly, a handler the ``[handlers]`` section will have its configuration held in a section called
called ``hand01`` in the ``[handlers]`` section will have its ``[handler_hand01]``, while a formatter called ``form01`` in the
configuration held in a section called ``[handler_hand01]``, while a ``[formatters]`` section will have its configuration specified in a section
formatter called ``form01`` in the ``[formatters]`` section will have called ``[formatter_form01]``. The root logger configuration must be specified
its configuration specified in a section called in a section called ``[logger_root]``.
``[formatter_form01]``. The root logger configuration must be
specified in a section called ``[logger_root]``.
Examples of these sections in the file are given below. :: Examples of these sections in the file are given below. ::
......
...@@ -63,7 +63,7 @@ The :mod:`shlex` module defines the following class: ...@@ -63,7 +63,7 @@ The :mod:`shlex` module defines the following class:
.. seealso:: .. seealso::
Module :mod:`configparser` Module :mod:`ConfigParser`
Parser for configuration files similar to the Windows :file:`.ini` files. Parser for configuration files similar to the Windows :file:`.ini` files.
......
...@@ -14,11 +14,7 @@ import httplib ...@@ -14,11 +14,7 @@ import httplib
import base64 import base64
import urlparse import urlparse
import cStringIO as StringIO import cStringIO as StringIO
try: from ConfigParser import ConfigParser
from configparser import ConfigParser
except ImportError:
# For backward-compatibility with Python versions < 2.6.
from ConfigParser import ConfigParser
class upload(PyPIRCCommand): class upload(PyPIRCCommand):
......
...@@ -5,11 +5,7 @@ that uses .pypirc in the distutils.command package. ...@@ -5,11 +5,7 @@ that uses .pypirc in the distutils.command package.
""" """
import os import os
import sys import sys
try: from ConfigParser import ConfigParser
from configparser import ConfigParser
except ImportError:
# For backward-compatibility with Python versions < 2.6.
from ConfigParser import ConfigParser
from distutils.cmd import Command from distutils.cmd import Command
......
...@@ -358,11 +358,7 @@ Common commands: (see '--help-commands' for more) ...@@ -358,11 +358,7 @@ Common commands: (see '--help-commands' for more)
def parse_config_files (self, filenames=None): def parse_config_files (self, filenames=None):
try: from ConfigParser import ConfigParser
from configparser import ConfigParser
except ImportError:
# For backward-compatibility with Python versions < 2.6.
from ConfigParser import ConfigParser
if filenames is None: if filenames is None:
filenames = self.find_config_files() filenames = self.find_config_files()
......
...@@ -21,7 +21,7 @@ import os ...@@ -21,7 +21,7 @@ import os
import sys import sys
import string import string
import macosxSupport import macosxSupport
from configparser import ConfigParser, NoOptionError, NoSectionError from ConfigParser import ConfigParser, NoOptionError, NoSectionError
class InvalidConfigType(Exception): pass class InvalidConfigType(Exception): pass
class InvalidConfigSet(Exception): pass class InvalidConfigSet(Exception): pass
......
...@@ -65,9 +65,9 @@ def fileConfig(fname, defaults=None): ...@@ -65,9 +65,9 @@ def fileConfig(fname, defaults=None):
rather than a filename, in which case the file-like object will be read rather than a filename, in which case the file-like object will be read
using readfp. using readfp.
""" """
import configparser import ConfigParser
cp = configparser.ConfigParser(defaults) cp = ConfigParser.ConfigParser(defaults)
if hasattr(cp, 'readfp') and hasattr(fname, 'readline'): if hasattr(cp, 'readfp') and hasattr(fname, 'readline'):
cp.readfp(fname) cp.readfp(fname)
else: else:
......
...@@ -37,7 +37,7 @@ class AllTest(unittest.TestCase): ...@@ -37,7 +37,7 @@ class AllTest(unittest.TestCase):
self.check_all("BaseHTTPServer") self.check_all("BaseHTTPServer")
self.check_all("Bastion") self.check_all("Bastion")
self.check_all("CGIHTTPServer") self.check_all("CGIHTTPServer")
self.check_all("configparser") self.check_all("ConfigParser")
self.check_all("Cookie") self.check_all("Cookie")
self.check_all("MimeWriter") self.check_all("MimeWriter")
self.check_all("Queue") self.check_all("Queue")
......
import configparser import ConfigParser
import StringIO import StringIO
import unittest import unittest
import UserDict import UserDict
...@@ -94,7 +94,7 @@ class TestCaseBase(unittest.TestCase): ...@@ -94,7 +94,7 @@ class TestCaseBase(unittest.TestCase):
"remove_option() failed to report non-existance of option" "remove_option() failed to report non-existance of option"
" that was removed") " that was removed")
self.assertRaises(configparser.NoSectionError, self.assertRaises(ConfigParser.NoSectionError,
cf.remove_option, 'No Such Section', 'foo') cf.remove_option, 'No Such Section', 'foo')
eq(cf.get('Long Line', 'foo'), eq(cf.get('Long Line', 'foo'),
...@@ -147,17 +147,17 @@ class TestCaseBase(unittest.TestCase): ...@@ -147,17 +147,17 @@ class TestCaseBase(unittest.TestCase):
def test_parse_errors(self): def test_parse_errors(self):
self.newconfig() self.newconfig()
self.parse_error(configparser.ParsingError, self.parse_error(ConfigParser.ParsingError,
"[Foo]\n extra-spaces: splat\n") "[Foo]\n extra-spaces: splat\n")
self.parse_error(configparser.ParsingError, self.parse_error(ConfigParser.ParsingError,
"[Foo]\n extra-spaces= splat\n") "[Foo]\n extra-spaces= splat\n")
self.parse_error(configparser.ParsingError, self.parse_error(ConfigParser.ParsingError,
"[Foo]\noption-without-value\n") "[Foo]\noption-without-value\n")
self.parse_error(configparser.ParsingError, self.parse_error(ConfigParser.ParsingError,
"[Foo]\n:value-without-option-name\n") "[Foo]\n:value-without-option-name\n")
self.parse_error(configparser.ParsingError, self.parse_error(ConfigParser.ParsingError,
"[Foo]\n=value-without-option-name\n") "[Foo]\n=value-without-option-name\n")
self.parse_error(configparser.MissingSectionHeaderError, self.parse_error(ConfigParser.MissingSectionHeaderError,
"No Section!\n") "No Section!\n")
def parse_error(self, exc, src): def parse_error(self, exc, src):
...@@ -170,13 +170,13 @@ class TestCaseBase(unittest.TestCase): ...@@ -170,13 +170,13 @@ class TestCaseBase(unittest.TestCase):
"new ConfigParser should have no defined sections") "new ConfigParser should have no defined sections")
self.failIf(cf.has_section("Foo"), self.failIf(cf.has_section("Foo"),
"new ConfigParser should have no acknowledged sections") "new ConfigParser should have no acknowledged sections")
self.assertRaises(configparser.NoSectionError, self.assertRaises(ConfigParser.NoSectionError,
cf.options, "Foo") cf.options, "Foo")
self.assertRaises(configparser.NoSectionError, self.assertRaises(ConfigParser.NoSectionError,
cf.set, "foo", "bar", "value") cf.set, "foo", "bar", "value")
self.get_error(configparser.NoSectionError, "foo", "bar") self.get_error(ConfigParser.NoSectionError, "foo", "bar")
cf.add_section("foo") cf.add_section("foo")
self.get_error(configparser.NoOptionError, "foo", "bar") self.get_error(ConfigParser.NoOptionError, "foo", "bar")
def get_error(self, exc, section, option): def get_error(self, exc, section, option):
try: try:
...@@ -215,7 +215,7 @@ class TestCaseBase(unittest.TestCase): ...@@ -215,7 +215,7 @@ class TestCaseBase(unittest.TestCase):
def test_weird_errors(self): def test_weird_errors(self):
cf = self.newconfig() cf = self.newconfig()
cf.add_section("Foo") cf.add_section("Foo")
self.assertRaises(configparser.DuplicateSectionError, self.assertRaises(ConfigParser.DuplicateSectionError,
cf.add_section, "Foo") cf.add_section, "Foo")
def test_write(self): def test_write(self):
...@@ -324,7 +324,7 @@ class TestCaseBase(unittest.TestCase): ...@@ -324,7 +324,7 @@ class TestCaseBase(unittest.TestCase):
class ConfigParserTestCase(TestCaseBase): class ConfigParserTestCase(TestCaseBase):
config_class = configparser.ConfigParser config_class = ConfigParser.ConfigParser
def test_interpolation(self): def test_interpolation(self):
cf = self.get_interpolation_config() cf = self.get_interpolation_config()
...@@ -335,11 +335,11 @@ class ConfigParserTestCase(TestCaseBase): ...@@ -335,11 +335,11 @@ class ConfigParserTestCase(TestCaseBase):
"something with lots of interpolation (9 steps)") "something with lots of interpolation (9 steps)")
eq(cf.get("Foo", "bar10"), eq(cf.get("Foo", "bar10"),
"something with lots of interpolation (10 steps)") "something with lots of interpolation (10 steps)")
self.get_error(configparser.InterpolationDepthError, "Foo", "bar11") self.get_error(ConfigParser.InterpolationDepthError, "Foo", "bar11")
def test_interpolation_missing_value(self): def test_interpolation_missing_value(self):
cf = self.get_interpolation_config() cf = self.get_interpolation_config()
e = self.get_error(configparser.InterpolationError, e = self.get_error(ConfigParser.InterpolationError,
"Interpolation Error", "name") "Interpolation Error", "name")
self.assertEqual(e.reference, "reference") self.assertEqual(e.reference, "reference")
self.assertEqual(e.section, "Interpolation Error") self.assertEqual(e.section, "Interpolation Error")
...@@ -375,7 +375,7 @@ class ConfigParserTestCase(TestCaseBase): ...@@ -375,7 +375,7 @@ class ConfigParserTestCase(TestCaseBase):
class RawConfigParserTestCase(TestCaseBase): class RawConfigParserTestCase(TestCaseBase):
config_class = configparser.RawConfigParser config_class = ConfigParser.RawConfigParser
def test_interpolation(self): def test_interpolation(self):
cf = self.get_interpolation_config() cf = self.get_interpolation_config()
...@@ -410,7 +410,7 @@ class RawConfigParserTestCase(TestCaseBase): ...@@ -410,7 +410,7 @@ class RawConfigParserTestCase(TestCaseBase):
class SafeConfigParserTestCase(ConfigParserTestCase): class SafeConfigParserTestCase(ConfigParserTestCase):
config_class = configparser.SafeConfigParser config_class = ConfigParser.SafeConfigParser
def test_safe_interpolation(self): def test_safe_interpolation(self):
# See http://www.python.org/sf/511737 # See http://www.python.org/sf/511737
......
...@@ -213,48 +213,9 @@ class TestStdlibRemovals(unittest.TestCase): ...@@ -213,48 +213,9 @@ class TestStdlibRemovals(unittest.TestCase):
self.assertEquals(str(w.message), msg) self.assertEquals(str(w.message), msg)
class TestStdlibRenames(unittest.TestCase):
renames = {'ConfigParser': 'configparser'}
def check_rename(self, module_name, new_module_name):
"""Make sure that:
- A DeprecationWarning is raised when importing using the
old 2.x module name.
- The module can be imported using the new 3.x name.
- The warning message specify both names.
"""
with CleanImport(module_name):
with catch_warning(record=False) as w:
warnings.filterwarnings("error", ".+ renamed to",
DeprecationWarning)
try:
__import__(module_name, level=0)
except DeprecationWarning as exc:
self.assert_(module_name in exc.args[0])
self.assert_(new_module_name in exc.args[0])
else:
self.fail("DeprecationWarning not raised for %s" %
module_name)
with CleanImport(new_module_name):
try:
__import__(new_module_name, level=0)
except ImportError:
self.fail("cannot import %s with its 3.x name, %s" %
module_name, new_module_name)
except DeprecationWarning:
self.fail("unexpected DeprecationWarning raised for %s" %
module_name)
def test_module_renames(self):
for module_name, new_module_name in self.renames.items():
self.check_rename(module_name, new_module_name)
def test_main(): def test_main():
run_unittest(TestPy3KWarnings, run_unittest(TestPy3KWarnings,
TestStdlibRemovals, TestStdlibRemovals)
TestStdlibRenames)
if __name__ == '__main__': if __name__ == '__main__':
test_main() test_main()
...@@ -135,9 +135,6 @@ Library ...@@ -135,9 +135,6 @@ Library
- The DEVICE, GL, gl, and cgen modules (which indirectly includes - The DEVICE, GL, gl, and cgen modules (which indirectly includes
cgensupport) have been deprecated for removal in Python 3.0. cgensupport) have been deprecated for removal in Python 3.0.
- The ConfigParser module has been renamed 'configparser'. The old
name is now deprecated.
- The CL, CL_old, and cl modules for IRIX have been deprecated for - The CL, CL_old, and cl modules for IRIX have been deprecated for
removal in Python 3.0. removal in Python 3.0.
...@@ -1904,13 +1901,13 @@ Library ...@@ -1904,13 +1901,13 @@ Library
Extension Modules Extension Modules
----------------- -----------------
- Patch #1657: added select.epoll and select.kqueue - Patch #1657: added select.epoll and select.kqueue.
- Patch #1506171: added operator.methodcaller(). - Patch #1506171: added operator.methodcaller().
- Patch #1826: operator.attrgetter() now supports dotted attribute paths. - Patch #1826: operator.attrgetter() now supports dotted attribute paths.
- Patch #1957: syslogmodule: Release GIL when calling syslog(3) - Patch #1957: syslogmodule: Release GIL when calling syslog(3).
- Bug #2112: mmap.error is now a subclass of EnvironmentError and not - Bug #2112: mmap.error is now a subclass of EnvironmentError and not
a direct EnvironmentError. a direct EnvironmentError.
......
...@@ -1862,7 +1862,7 @@ codecs Lookup existing Unicode encodings and register new ones. ...@@ -1862,7 +1862,7 @@ codecs Lookup existing Unicode encodings and register new ones.
colorsys Conversion functions between RGB and other color systems. colorsys Conversion functions between RGB and other color systems.
commands Tools for executing UNIX commands . commands Tools for executing UNIX commands .
compileall Force "compilation" of all .py files in a directory. compileall Force "compilation" of all .py files in a directory.
configparser Configuration file parser (much like windows .ini files) ConfigParser Configuration file parser (much like windows .ini files)
copy Generic shallow and deep copying operations. copy Generic shallow and deep copying operations.
copy_reg Helper to provide extensibility for pickle/cPickle. copy_reg Helper to provide extensibility for pickle/cPickle.
csv Read and write files with comma separated values. csv Read and write files with comma separated values.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment