-
-
Notifications
You must be signed in to change notification settings - Fork 448
Support .coveragerc.toml
for configuration
#1952
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
Draft
OlenaYefymenko
wants to merge
4
commits into
nedbat:master
Choose a base branch
from
OlenaYefymenko:support-configuration-coverage-toml
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -64,9 +64,10 @@ def test_named_config_file(self, file_class: FilePathType) -> None: | |
assert not cov.config.branch | ||
assert cov.config.data_file == "delete.me" | ||
|
||
def test_toml_config_file(self) -> None: | ||
# A pyproject.toml file will be read into the configuration. | ||
self.make_file("pyproject.toml", """\ | ||
@pytest.mark.parametrize("filename", ["pyproject.toml", ".coveragerc.toml"]) | ||
def test_toml_config_file(self, filename: str) -> None: | ||
# A pyproject.toml and coveragerc.toml will be read into the configuration. | ||
self.make_file(filename, """\ | ||
# This is just a bogus toml file for testing. | ||
[tool.somethingelse] | ||
authors = ["Joe D'Ávila <[email protected]>"] | ||
|
@@ -94,9 +95,10 @@ def test_toml_config_file(self) -> None: | |
assert cov.config.fail_under == 90.5 | ||
assert cov.config.get_plugin_options("plugins.a_plugin") == {"hello": "world"} | ||
|
||
def test_toml_ints_can_be_floats(self) -> None: | ||
@pytest.mark.parametrize("filename", ["pyproject.toml", ".coveragerc.toml"]) | ||
def test_toml_ints_can_be_floats(self, filename: str) -> None: | ||
# Test that our class doesn't reject integers when loading floats | ||
self.make_file("pyproject.toml", """\ | ||
self.make_file(filename, """\ | ||
# This is just a bogus toml file for testing. | ||
[tool.coverage.report] | ||
fail_under = 90 | ||
|
@@ -206,6 +208,7 @@ def test_parse_errors(self, bad_config: str, msg: str) -> None: | |
with pytest.raises(ConfigError, match=msg): | ||
coverage.Coverage() | ||
|
||
@pytest.mark.parametrize("filename", ["pyproject.toml", ".coveragerc.toml"]) | ||
@pytest.mark.parametrize("bad_config, msg", [ | ||
("[tool.coverage.run]\ntimid = \"maybe?\"\n", r"maybe[?]"), | ||
("[tool.coverage.run\n", None), | ||
|
@@ -223,9 +226,9 @@ def test_parse_errors(self, bad_config: str, msg: str) -> None: | |
("[tool.coverage.report]\nprecision=1.23", "not an integer"), | ||
('[tool.coverage.report]\nfail_under="s"', "couldn't convert to a float"), | ||
]) | ||
def test_toml_parse_errors(self, bad_config: str, msg: str) -> None: | ||
def test_toml_parse_errors(self, filename: str, bad_config: str, msg: str) -> None: | ||
# Im-parsable values raise ConfigError, with details. | ||
self.make_file("pyproject.toml", bad_config) | ||
self.make_file(filename, bad_config) | ||
with pytest.raises(ConfigError, match=msg): | ||
coverage.Coverage() | ||
|
||
|
@@ -251,9 +254,10 @@ def test_environment_vars_in_config(self) -> None: | |
assert cov.config.branch is True | ||
assert cov.config.exclude_list == ["the_$one", "anotherZZZ", "xZZZy", "xy", "huh${X}what"] | ||
|
||
def test_environment_vars_in_toml_config(self) -> None: | ||
@pytest.mark.parametrize("filename", ["pyproject.toml", ".coveragerc.toml"]) | ||
def test_environment_vars_in_toml_config(self, filename: str) -> None: | ||
# Config files can have $envvars in them. | ||
self.make_file("pyproject.toml", """\ | ||
self.make_file(filename, """\ | ||
[tool.coverage.run] | ||
data_file = "$DATA_FILE.fooey" | ||
branch = "$BRANCH" | ||
|
@@ -325,9 +329,10 @@ def expanduser(s: str) -> str: | |
assert cov.config.exclude_list == ["~/data.file", "~joe/html_dir"] | ||
assert cov.config.paths == {'mapping': ['/Users/me/src', '/Users/joe/source']} | ||
|
||
def test_tilde_in_toml_config(self) -> None: | ||
@pytest.mark.parametrize("filename", ["pyproject.toml", ".coveragerc.toml"]) | ||
def test_tilde_in_toml_config(self, filename: str) -> None: | ||
# Config entries that are file paths can be tilde-expanded. | ||
self.make_file("pyproject.toml", """\ | ||
self.make_file(filename, """\ | ||
[tool.coverage.run] | ||
data_file = "~/data.file" | ||
|
||
|
@@ -442,21 +447,13 @@ def test_unknown_option(self) -> None: | |
with pytest.warns(CoverageWarning, match=msg): | ||
_ = coverage.Coverage() | ||
|
||
def test_unknown_option_toml(self) -> None: | ||
self.make_file("pyproject.toml", """\ | ||
@pytest.mark.parametrize("filename", ["pyproject.toml", ".coveragerc.toml"]) | ||
def test_unknown_option_toml(self, filename: str) -> None: | ||
self.make_file(filename, """\ | ||
[tool.coverage.run] | ||
xyzzy = 17 | ||
""") | ||
msg = r"Unrecognized option '\[tool.coverage.run\] xyzzy=' in config file pyproject.toml" | ||
with pytest.warns(CoverageWarning, match=msg): | ||
_ = coverage.Coverage() | ||
|
||
def test_misplaced_option(self) -> None: | ||
self.make_file(".coveragerc", """\ | ||
[report] | ||
branch = True | ||
""") | ||
msg = r"Unrecognized option '\[report\] branch=' in config file .coveragerc" | ||
msg = f"Unrecognized option '\\[tool.coverage.run\\] xyzzy=' in config file {filename}" | ||
with pytest.warns(CoverageWarning, match=msg): | ||
_ = coverage.Coverage() | ||
|
||
|
@@ -481,8 +478,10 @@ def test_exceptions_from_missing_things(self) -> None: | |
with pytest.raises(ConfigError, match="No option 'foo' in section: 'xyzzy'"): | ||
config.get("xyzzy", "foo") | ||
|
||
def test_exclude_also(self) -> None: | ||
self.make_file("pyproject.toml", """\ | ||
|
||
@pytest.mark.parametrize("filename", ["pyproject.toml", ".coveragerc.toml"]) | ||
def test_exclude_also(self, filename: str) -> None: | ||
self.make_file(filename, """\ | ||
[tool.coverage.report] | ||
exclude_also = ["foobar", "raise .*Error"] | ||
""") | ||
|
@@ -815,16 +814,62 @@ def test_no_toml_installed_pyproject_no_coverage(self) -> None: | |
assert not cov.config.branch | ||
assert cov.config.data_file == ".coverage" | ||
|
||
def test_exceptions_from_missing_toml_things(self) -> None: | ||
self.make_file("pyproject.toml", """\ | ||
@pytest.mark.parametrize("filename", ["pyproject.toml", ".coveragerc.toml"]) | ||
def test_exceptions_from_missing_toml_things(self, filename: str) -> None: | ||
self.make_file(filename, """\ | ||
[tool.coverage.run] | ||
branch = true | ||
""") | ||
config = TomlConfigParser(False) | ||
config.read("pyproject.toml") | ||
config.read(filename) | ||
with pytest.raises(ConfigError, match="No section: 'xyzzy'"): | ||
config.options("xyzzy") | ||
with pytest.raises(ConfigError, match="No section: 'xyzzy'"): | ||
config.get("xyzzy", "foo") | ||
with pytest.raises(ConfigError, match="No option 'foo' in section: 'tool.coverage.run'"): | ||
config.get("run", "foo") | ||
|
||
def test_coveragerc_toml_priority(self) -> None: | ||
"""Test that .coveragerc.toml has priority over pyproject.toml.""" | ||
Comment on lines
+832
to
+833
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is testing priority only over There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes. |
||
self.make_file(".coveragerc.toml", """\ | ||
[tool.coverage.run] | ||
timid = true | ||
data_file = ".toml-data.dat" | ||
branch = true | ||
""") | ||
|
||
self.make_file("pyproject.toml", """\ | ||
[tool.coverage.run] | ||
timid = false | ||
data_file = "pyproject-data.dat" | ||
branch = false | ||
""") | ||
cov = coverage.Coverage() | ||
|
||
assert cov.config.timid is True | ||
assert cov.config.data_file == ".toml-data.dat" | ||
assert cov.config.branch is True | ||
|
||
|
||
@pytest.mark.skipif(env.PYVERSION >= (3, 11), reason="Python 3.11 has toml in stdlib") | ||
def test_toml_file_exists_but_no_toml_support(self) -> None: | ||
"""Test behavior when .coveragerc.toml exists but TOML support is missing.""" | ||
self.make_file(".coveragerc.toml", """\ | ||
[tool.coverage.run] | ||
timid = true | ||
data_file = ".toml-data.dat" | ||
""") | ||
|
||
with mock.patch.object(coverage.tomlconfig, "has_tomllib", False): | ||
msg = "Can't read '.coveragerc.toml' without TOML support" | ||
with pytest.raises(ConfigError, match=msg): | ||
coverage.Coverage(config_file=".coveragerc.toml") | ||
self.make_file(".coveragerc", """\ | ||
[run] | ||
timid = false | ||
data_file = .ini-data.dat | ||
""") | ||
|
||
cov = coverage.Coverage() | ||
assert not cov.config.timid | ||
assert cov.config.data_file == ".ini-data.dat" |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the priority of the new config properly determined in the
config_files_to_try
function?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good.