Skip to content

Latest commit

 

History

History
146 lines (106 loc) · 4.69 KB

test_config_defaults.rst

File metadata and controls

146 lines (106 loc) · 4.69 KB
>>> from optparse import OptionParser
>>> import os
>>> from cStringIO import StringIO
>>> import nose.config

All commandline options to fall back to values configured in configuration files. The configuration lives in a single section ("nosetests") in each configuration file.

>>> support = os.path.join(os.path.dirname(__file__), "support",
...                        "config_defaults")
>>> def error(msg):
...     print "error: %s" % msg
>>> def get_parser():
...     parser = OptionParser()
...     parser.add_option(
...         "-v", "--verbose",
...         action="count", dest="verbosity",
...         default=1)
...     parser.add_option(
...         "--verbosity", action="store", dest="verbosity",
...         type="int")
...     return nose.config.ConfiguredDefaultsOptionParser(parser,
...                                                       "nosetests",
...                                                       error)
>>> def parse(args, config_files):
...     argv = ["nosetests"] + list(args)
...     return get_parser().parseArgsAndConfigFiles(argv, config_files)

Options on the command line combine with the defaults from the config files and the options' own defaults (here, -v adds 1 to verbosity of 3 from a.cfg). Config file defaults take precedence over options' defaults.

>>> options, args = parse([], [])
>>> options.verbosity
1
>>> options, args = parse([], os.path.join(support, "a.cfg"))
>>> options.verbosity
3
>>> options, args = parse(["-v"], os.path.join(support, "a.cfg"))
>>> options.verbosity
4

Command line arguments take precedence

>>> options, args = parse(["--verbosity=7"], os.path.join(support, "a.cfg"))
>>> options.verbosity
7

Where options appear in several config files, the last config file wins

>>> files = [os.path.join(support, "b.cfg"), os.path.join(support, "a.cfg")]
>>> options, args = parse([], files)
>>> options.verbosity
3

Invalid values should cause an error specifically about configuration files (not about a commandline option)

>>> options, arguments = parse([], StringIO("""\
... [nosetests]
... verbosity = spam
... """))
error: Error reading config file '<???>': option 'verbosity': invalid integer value: 'spam'

Unrecognised option in nosetests config section

>>> options, args = parse([], StringIO("[nosetests]\nspam=eggs\n"))
error: Error reading config file '<???>': no such option 'spam'

If there were multiple config files, the error message tells us which file contains the bad option name or value

>>> options, args = parse([], [os.path.join(support, "a.cfg"),
...                            os.path.join(support, "invalid_value.cfg"),
...                            os.path.join(support, "b.cfg")])
... # doctest: +ELLIPSIS
error: Error reading config file '...invalid_value.cfg': option 'verbosity': invalid integer value: 'spam'

Invalid config files

(file-like object)

>>> options, args = parse([], StringIO("spam")) # doctest: +ELLIPSIS
error: Error reading config file '<???>': File contains no section headers.
file: ...<???>..., line: 1
'spam'

(filename)

>>> options, args = parse([], os.path.join(support, "invalid.cfg"))
... # doctest: +ELLIPSIS
error: Error reading config file '...invalid.cfg': File contains no section headers.
file: ...invalid.cfg..., line: 1
'spam\n'

(filenames, length == 1)

>>> options, args = parse([], [os.path.join(support, "invalid.cfg")])
... # doctest: +ELLIPSIS
error: Error reading config file '...invalid.cfg': File contains no section headers.
file: ...invalid.cfg..., line: 1
'spam\n'

(filenames, length > 1)

If there were multiple config files, the error message tells us which file is bad

>>> options, args = parse([], [os.path.join(support, "a.cfg"),
...                            os.path.join(support, "invalid.cfg"),
...                            os.path.join(support, "b.cfg")])
... # doctest: +ELLIPSIS
error: Error reading config file '...invalid.cfg': File contains no section headers.
file: ...invalid.cfg..., line: 1
'spam\n'

Missing config files don't deserve an error or warning

(filename)

>>> options, args = parse([], os.path.join(support, "nonexistent.cfg"))
>>> print options.__dict__
{'verbosity': 1}

(filenames)

>>> options, args = parse([], [os.path.join(support, "nonexistent.cfg")])
>>> print options.__dict__
{'verbosity': 1}

The same goes for missing config file section ("nosetests")

>>> options, args = parse([], StringIO("[spam]\nfoo=bar\n"))
>>> print options.__dict__
{'verbosity': 1}