Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for configuration inside 'setup.cfg' #161

Merged
merged 4 commits into from
Jun 22, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions green/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,10 @@ def parseArguments(): # pragma: no cover

1) $HOME/.green
2) A config file specified by the environment variable $GREEN_CONFIG
3) .green in the current working directory of the test run
4) A config file specified by the command-line argument "--config FILE"
5) Command-line arguments.
3) setup.cfg in the current working directory of test run
4) .green in the current working directory of the test run
5) A config file specified by the command-line argument "--config FILE"
6) Command-line arguments.

Any arguments specified in more than one place will be overwritten by the
value of the LAST place the setting is seen. So, for example, if a setting
Expand Down Expand Up @@ -311,7 +312,8 @@ class ConfigFile(object): # pragma: no cover

def __init__(self, filepath):
self.first = True
self.lines = open(filepath).readlines()
with open(filepath) as f:
self.lines = f.readlines()

# Python 2.7 (Older dot versions)
def readline(self):
Expand Down Expand Up @@ -365,9 +367,10 @@ def getConfig(filepath=None): # pragma: no cover
filepaths.append(env_filepath)

# Medium priority
cwd_filepath = os.path.join(os.getcwd(), ".green")
if os.path.isfile(cwd_filepath):
filepaths.append(cwd_filepath)
for cfg_file in ("setup.cfg", ".green"):
cwd_filepath = os.path.join(os.getcwd(), cfg_file)
if os.path.isfile(cwd_filepath):
filepaths.append(cwd_filepath)

# High priority
if filepath and os.path.isfile(filepath):
Expand All @@ -380,7 +383,13 @@ def getConfig(filepath=None): # pragma: no cover
# parser.readfp(obj_with_readline)
read_func = getattr(parser, 'read_file', getattr(parser, 'readfp'))
for filepath in filepaths:
read_func(ConfigFile(filepath))
# Users are expected to put a [green] section
# only if they use setup.cfg
if filepath.endswith('setup.cfg'):
with open(filepath) as f:
read_func(f)
else:
read_func(ConfigFile(filepath))

return parser

Expand Down
209 changes: 194 additions & 15 deletions green/test/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,20 +120,29 @@ def setUp(self):
"omit-patterns = {}".format(self.cmd_filename),
"run-coverage = {}".format(self.cmd_run_coverage),
])
self.setup_filename = os.path.join(cwd_dir, "setup.cfg")
self.setup_failfast = False
self.setup_verbose = 3
self._write_file(self.setup_filename,
["[green]",
"failfast = {}".format(str(self.setup_failfast)),
"verbose = {}".format(str(self.setup_verbose))
])


class TestConfig(ConfigBase):
"""
All variations of config file parsing works as expected.
"""

def test_cmd_env_nodef(self):
def test_cmd_env_nodef_nosetup(self):
"""
Setup: --config on cmd, $GREEN_CONFIG is set, $HOME/.green does not
exist
exist, setup.cfg does not exist
Result: load --config
"""
os.unlink(self.default_filename)
os.remove(self.setup_filename)
with ModifiedEnvironment(GREEN_CONFIG=self.env_filename,
HOME=self.tmpd):
cfg = config.getConfig(self.cmd_filename)
Expand All @@ -145,13 +154,16 @@ def test_cmd_env_nodef(self):
ae(self.cmd_logging, cfg.getboolean("green", "logging"))
ae(self.env_no_skip_report, cfg.getboolean("green", "no-skip-report"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "version")
ar(configparser.NoOptionError, cfg.getboolean, "green", "verbose")

def test_cmd_noenv_def(self):
def test_cmd_noenv_def_nosetup(self):
"""
Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green exists
Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green exists,
setup.cfg does not exist
Result: load --config
"""
os.unlink(self.env_filename)
os.remove(self.setup_filename)
with ModifiedEnvironment(GREEN_CONFIG=None, HOME=self.tmpd):
cfg = config.getConfig(self.cmd_filename)
ae = self.assertEqual
Expand All @@ -162,14 +174,17 @@ def test_cmd_noenv_def(self):
ae(self.cmd_logging, cfg.getboolean("green", "logging"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "no-skip-report")
ae(self.default_version, cfg.getboolean("green", "version"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "verbose")

def test_cmd_noenv_nodef(self):
def test_cmd_noenv_nodef_nosetup(self):
"""
Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green does not exist
Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green does not
exist, setup.cfg does not exist
Result: load --config
"""
os.unlink(self.env_filename)
os.unlink(self.default_filename)
os.remove(self.setup_filename)
with ModifiedEnvironment(GREEN_CONFIG=None, HOME=self.tmpd):
cfg = config.getConfig(self.cmd_filename)
ae = self.assertEqual
Expand All @@ -180,14 +195,16 @@ def test_cmd_noenv_nodef(self):
ae(self.cmd_logging, cfg.getboolean("green", "logging"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "no-skip-report")
ar(configparser.NoOptionError, cfg.getboolean, "green", "version")
ar(configparser.NoOptionError, cfg.getboolean, "green", "verbose")

def test_nocmd_env_cwd(self):
"""
Setup: no --config option, $GREEN_CONFIG is set, .green in local dir
Setup: no --config option, $GREEN_CONFIG is set, .green in local dir,
Result: load $GREEN_CONFIG
"""
os.chdir(self.tmpd) # setUp is already set to restore us to our pre-testing cwd
os.unlink(self.cmd_filename)
os.remove(self.setup_filename)
with ModifiedEnvironment(GREEN_CONFIG=self.env_filename,
HOME=self.tmpd):
cfg = config.getConfig()
Expand All @@ -199,13 +216,16 @@ def test_nocmd_env_cwd(self):
ae(self.default_logging, cfg.getboolean("green", "logging"))
ae(self.env_no_skip_report, cfg.getboolean("green", "no-skip-report"))
ae(self.default_version, cfg.getboolean("green", "version"))
ar(configparser.NoOptionError, cfg.getint, "green", "verbose")

def test_nocmd_env_def(self):
def test_nocmd_env_def_nosetup(self):
"""
Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green exists
Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green exists,
setup.cfg does not exist
Result: load $GREEN_CONFIG
"""
os.unlink(self.cmd_filename)
os.remove(self.setup_filename)
with ModifiedEnvironment(GREEN_CONFIG=self.env_filename,
HOME=self.tmpd):
cfg = config.getConfig()
Expand All @@ -217,15 +237,17 @@ def test_nocmd_env_def(self):
ae(self.env_logging, cfg.getboolean("green", "logging"))
ae(self.env_no_skip_report, cfg.getboolean("green", "no-skip-report"))
ae(self.default_version, cfg.getboolean("green", "version"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "verbose")

def test_nocmd_env_nodef(self):
def test_nocmd_env_nodef_nosetup(self):
"""
Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green does not
exist
exist, setup.cfg does not exist
Result: load $GREEN_CONFIG
"""
os.unlink(self.cmd_filename)
os.unlink(self.default_filename)
os.remove(self.setup_filename)
with ModifiedEnvironment(GREEN_CONFIG=self.env_filename,
HOME=self.tmpd):
cfg = config.getConfig()
Expand All @@ -237,14 +259,17 @@ def test_nocmd_env_nodef(self):
ae(self.env_logging, cfg.getboolean("green", "logging"))
ae(self.env_no_skip_report, cfg.getboolean("green", "no-skip-report"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "version")
ar(configparser.NoOptionError, cfg.getboolean, "green", "verbose")

def test_nocmd_noenv_def(self):
def test_nocmd_noenv_def_nosetup(self):
"""
Setup: no --config option, $GREEN_CONFIG unset, $HOME/.green exists
Setup: no --config option, $GREEN_CONFIG unset, $HOME/.green exists,
setup.cfg does not exist
Result: load $HOME/.green
"""
os.unlink(self.cmd_filename)
os.unlink(self.env_filename)
os.remove(self.setup_filename)
with ModifiedEnvironment(GREEN_CONFIG=None, HOME=self.tmpd):
cfg = config.getConfig()
ae = self.assertEqual
Expand All @@ -255,15 +280,18 @@ def test_nocmd_noenv_def(self):
ae(self.default_logging, cfg.getboolean("green", "logging"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "no-skip-report")
ae(self.default_version, cfg.getboolean("green", "version"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "verbose")

def test_nocmd_noenv_nodef(self):
def test_nocmd_noenv_nodef_nosetup(self):
"""
Setup: no --config option, $GREEN_CONFIG unset, no $HOME/.green
Setup: no --config option, $GREEN_CONFIG unset, no $HOME/.green,
setup.cfg does not exist
Result: empty config
"""
os.unlink(self.default_filename)
os.unlink(self.env_filename)
os.unlink(self.cmd_filename)
os.remove(self.setup_filename)
with ModifiedEnvironment(GREEN_CONFIG=None, HOME=self.tmpd):
cfg = config.getConfig()
ae = self.assertEqual
Expand All @@ -274,6 +302,157 @@ def test_nocmd_noenv_nodef(self):
ar(configparser.NoSectionError, cfg.get, "green", "logging")
ar(configparser.NoSectionError, cfg.get, "green", "no-skip-report")
ar(configparser.NoSectionError, cfg.get, "green", "version")
ar(configparser.NoSectionError, cfg.get, "green", "verbose")

def test_cmd_env_nodef_setup(self):
"""
Setup: --config on cmd, $GREEN_CONFIG is set, $HOME/.green does not
exist, setup.cfg exists
Result: load --config
"""
os.unlink(self.default_filename)
with ModifiedEnvironment(GREEN_CONFIG=self.env_filename,
HOME=self.tmpd):
cfg = config.getConfig(self.cmd_filename)
ae = self.assertEqual
ar = self.assertRaises
ae(["green"], cfg.sections())
ae(self.cmd_filename, cfg.get("green", "omit-patterns"))
ae(self.cmd_run_coverage, cfg.getboolean("green", "run-coverage"))
ae(self.cmd_logging, cfg.getboolean("green", "logging"))
ae(self.env_no_skip_report, cfg.getboolean("green", "no-skip-report"))
ae(self.setup_verbose, cfg.getint("green", "verbose"))
ae(self.setup_failfast, cfg.getboolean("green", "failfast"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "version")

def test_cmd_noenv_def_setup(self):
"""
Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green exists,
setup.cfg exists
Result: load --config
"""
os.unlink(self.env_filename)
with ModifiedEnvironment(GREEN_CONFIG=None, HOME=self.tmpd):
cfg = config.getConfig(self.cmd_filename)
ae = self.assertEqual
ar = self.assertRaises
ae(["green"], cfg.sections())
ae(self.cmd_filename, cfg.get("green", "omit-patterns"))
ae(self.cmd_run_coverage, cfg.getboolean("green", "run-coverage"))
ae(self.cmd_logging, cfg.getboolean("green", "logging"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "no-skip-report")
ae(self.default_version, cfg.getboolean("green", "version"))
ae(self.setup_verbose, cfg.getint("green", "verbose"))
ae(self.setup_failfast, cfg.getboolean("green", "failfast"))

def test_cmd_noenv_nodef_setup(self):
"""
Setup: --config on cmd, $GREEN_CONFIG unset, $HOME/.green does not exist,
setup.cfg exists
Result: load --config
"""
os.unlink(self.env_filename)
os.unlink(self.default_filename)
with ModifiedEnvironment(GREEN_CONFIG=None, HOME=self.tmpd):
cfg = config.getConfig(self.cmd_filename)
ae = self.assertEqual
ar = self.assertRaises
ae(["green"], cfg.sections())
ae(self.cmd_filename, cfg.get("green", "omit-patterns"))
ae(self.cmd_run_coverage, cfg.getboolean("green", "run-coverage"))
ae(self.cmd_logging, cfg.getboolean("green", "logging"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "no-skip-report")
ar(configparser.NoOptionError, cfg.getboolean, "green", "version")
ae(self.setup_verbose, cfg.getint("green", "verbose"))
ae(self.setup_failfast, cfg.getboolean("green", "failfast"))

def test_nocmd_env_def_setup(self):
"""
Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green exists,
setup.cfg exists
Result: load $GREEN_CONFIG
"""
os.unlink(self.cmd_filename)
with ModifiedEnvironment(GREEN_CONFIG=self.env_filename,
HOME=self.tmpd):
cfg = config.getConfig()
ae = self.assertEqual
ar = self.assertRaises
ae(["green"], cfg.sections())
ae(self.env_filename, cfg.get("green", "omit-patterns"))
ar(configparser.NoOptionError, cfg.get, "green", "run-coverage")
ae(self.env_logging, cfg.getboolean("green", "logging"))
ae(self.env_no_skip_report, cfg.getboolean("green", "no-skip-report"))
ae(self.default_version, cfg.getboolean("green", "version"))
ae(self.setup_verbose, cfg.getint("green", "verbose"))
ae(self.setup_failfast, cfg.getboolean("green", "failfast"))

def test_nocmd_env_nodef_setup(self):
"""
Setup: no --config option, $GREEN_CONFIG is set, $HOME/.green does not
exist, setup.cfg exists
Result: load $GREEN_CONFIG
"""
os.unlink(self.cmd_filename)
os.unlink(self.default_filename)
with ModifiedEnvironment(GREEN_CONFIG=self.env_filename,
HOME=self.tmpd):
cfg = config.getConfig()
ae = self.assertEqual
ar = self.assertRaises
ae(["green"], cfg.sections())
ae(self.env_filename, cfg.get("green", "omit-patterns"))
ar(configparser.NoOptionError, cfg.get, "green", "run-coverage")
ae(self.env_logging, cfg.getboolean("green", "logging"))
ae(self.env_no_skip_report, cfg.getboolean("green", "no-skip-report"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "version")
ae(self.setup_verbose, cfg.getint("green", "verbose"))
ae(self.setup_failfast, cfg.getboolean("green", "failfast"))

def test_nocmd_noenv_def_setup(self):
"""
Setup: no --config option, $GREEN_CONFIG unset, $HOME/.green exists,
setup.cfg exists
Result: load $HOME/.green
"""
os.unlink(self.cmd_filename)
os.unlink(self.env_filename)
with ModifiedEnvironment(GREEN_CONFIG=None, HOME=self.tmpd):
cfg = config.getConfig()
ae = self.assertEqual
ar = self.assertRaises
ae(["green"], cfg.sections())
ae(self.default_filename, cfg.get("green", "omit-patterns"))
ar(configparser.NoOptionError, cfg.get, "green", "run-coverage")
ae(self.default_logging, cfg.getboolean("green", "logging"))
ar(configparser.NoOptionError, cfg.getboolean, "green", "no-skip-report")
ae(self.default_version, cfg.getboolean("green", "version"))
ae(self.setup_verbose, cfg.getint("green", "verbose"))
ae(self.setup_failfast, cfg.getboolean("green", "failfast"))

def test_nocmd_noenv_nodef_setup(self):
"""
Setup: no --config option, $GREEN_CONFIG unset, no $HOME/.green,
setup.cfg exists
Result: empty config
"""
os.unlink(self.default_filename)
os.unlink(self.env_filename)
os.unlink(self.cmd_filename)
with ModifiedEnvironment(GREEN_CONFIG=None, HOME=self.tmpd):
cfg = config.getConfig()
ae = self.assertEqual
ar = self.assertRaises
ae(self.setup_verbose, cfg.getint("green", "verbose"))
ae(self.setup_failfast, cfg.getboolean("green", "failfast"))
ar(configparser.NoOptionError, cfg.get, "green", "omit-patterns")
ar(configparser.NoOptionError, cfg.get, "green", "run-coverage")
ar(configparser.NoOptionError, cfg.get, "green", "logging")
ar(configparser.NoOptionError, cfg.get, "green", "no-skip-report")
ar(configparser.NoOptionError, cfg.get, "green", "version")





class TestMergeConfig(ConfigBase):
Expand Down