ConfigParser:

- read() method returns a list of files parsed successfully
- add tests, documentation
(closes SF patch #677651)
This commit is contained in:
Fred Drake 2004-05-18 04:24:02 +00:00
parent b4c6091984
commit 82903148a8
4 changed files with 32 additions and 2 deletions

View File

@ -177,7 +177,8 @@ return \constant{True}; otherwise return \constant{False}.
\end{methoddesc} \end{methoddesc}
\begin{methoddesc}{read}{filenames} \begin{methoddesc}{read}{filenames}
Read and parse a list of filenames. If \var{filenames} is a string or Attempt to read and parse a list of filenames, returning a list of filenames
which were successfully parsed. If \var{filenames} is a string or
Unicode string, it is treated as a single filename. Unicode string, it is treated as a single filename.
If a file named in \var{filenames} cannot be opened, that file will be If a file named in \var{filenames} cannot be opened, that file will be
ignored. This is designed so that you can specify a list of potential ignored. This is designed so that you can specify a list of potential
@ -197,6 +198,7 @@ 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')])
\end{verbatim} \end{verbatim}
\versionchanged[Returns list of successfully parsed filenames]{2.4}
\end{methoddesc} \end{methoddesc}
\begin{methoddesc}{readfp}{fp\optional{, filename}} \begin{methoddesc}{readfp}{fp\optional{, filename}}

View File

@ -45,7 +45,7 @@ ConfigParser -- responsible for parsing a list of
read(filenames) read(filenames)
read and parse the list of named configuration files, given by read and parse the list of named configuration files, given by
name. A single filename is also allowed. Non-existing files name. A single filename is also allowed. Non-existing files
are ignored. are ignored. Return list of successfully read files.
readfp(fp, filename=None) readfp(fp, filename=None)
read and parse one configuration file, given as a file object. read and parse one configuration file, given as a file object.
@ -252,9 +252,12 @@ class RawConfigParser:
home directory, systemwide directory), and all existing home directory, systemwide directory), and all existing
configuration files in the list will be read. A single configuration files in the list will be read. A single
filename may also be given. filename may also be given.
Return list of successfully read files.
""" """
if isinstance(filenames, basestring): if isinstance(filenames, basestring):
filenames = [filenames] filenames = [filenames]
read_ok = []
for filename in filenames: for filename in filenames:
try: try:
fp = open(filename) fp = open(filename)
@ -262,6 +265,8 @@ class RawConfigParser:
continue continue
self._read(fp, filename) self._read(fp, filename)
fp.close() fp.close()
read_ok.append(filename)
return read_ok
def readfp(self, fp, filename=None): def readfp(self, fp, filename=None):
"""Like read() but the argument must be a file-like object. """Like read() but the argument must be a file-like object.

2
Lib/test/cfgparser.1 Normal file
View File

@ -0,0 +1,2 @@
[Foo Bar]
foo=newbar

View File

@ -242,6 +242,27 @@ class TestCaseBase(unittest.TestCase):
self.assertRaises(TypeError, cf.set, "sect", "option2", 1.0) self.assertRaises(TypeError, cf.set, "sect", "option2", 1.0)
self.assertRaises(TypeError, cf.set, "sect", "option2", object()) self.assertRaises(TypeError, cf.set, "sect", "option2", object())
def test_read_returns_file_list(self):
file1 = test_support.findfile("cfgparser.1")
# check when we pass a mix of readable and non-readable files:
cf = self.newconfig()
parsed_files = cf.read([file1, "nonexistant-file"])
self.assertEqual(parsed_files, [file1])
self.assertEqual(cf.get("Foo Bar", "foo"), "newbar")
# check when we pass only a filename:
cf = self.newconfig()
parsed_files = cf.read(file1)
self.assertEqual(parsed_files, [file1])
self.assertEqual(cf.get("Foo Bar", "foo"), "newbar")
# check when we pass only missing files:
cf = self.newconfig()
parsed_files = cf.read(["nonexistant-file"])
self.assertEqual(parsed_files, [])
# check when we pass no files:
cf = self.newconfig()
parsed_files = cf.read([])
self.assertEqual(parsed_files, [])
# shared by subclasses # shared by subclasses
def get_interpolation_config(self): def get_interpolation_config(self):
return self.fromstring( return self.fromstring(