    >>> from optparse import OptionParser
    >>> import os
    >>> try:
    ...     from StringIO import StringIO
    ... except:
    ...     from io 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}
