forked from OSGeo/grass
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pytest: Collect all uncovered Python files in code coverage (OSGeo#4077)
* Create .coveragerc config file to keep options when using subprocess * Create coverage_mapper.py to fix non-standard installation paths of scripts * pytest: Upload artifact of HTML code coverage report containing test context * pytest: Fix non-standard installed scripts paths in coverage data * Update .gitignore
- Loading branch information
Showing
4 changed files
with
126 additions
and
1 deletion.
There are no files selected for viewing
This file contains 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 |
---|---|---|
@@ -0,0 +1,64 @@ | ||
[run] | ||
; branch = True | ||
; dynamic_context = test_function | ||
concurrency = multiprocessing,thread | ||
parallel = True | ||
data_file = ${INITIAL_PWD-.}/.coverage | ||
omit = | ||
${INITIAL_PWD-.}/testreport | ||
${INITIAL_PWD-.}/.github/* | ||
${INITIAL_PWD-.}/bin.*/* | ||
${INITIAL_PWD-.}/dist.*/* | ||
**/OBJ.*/* | ||
source = | ||
. | ||
${INITIAL_PWD-.}/ | ||
${INITIAL_GISBASE-/usr/local/grass??}/ | ||
|
||
[paths] | ||
root = | ||
./ | ||
${INITIAL_GISBASE-/usr/local/grass??}/ | ||
/home/*/install/grass??/ | ||
python = | ||
./python/ | ||
${INITIAL_GISBASE-/usr/local/grass??}/etc/python/ | ||
/home/*/install/grass??/etc/python/ | ||
special_d_mon = | ||
./display/d.mon/ | ||
${INITIAL_GISBASE-/usr/local/grass??}/etc/d.mon/ | ||
/home/*/install/grass??/etc/d.mon/ | ||
special_r_in_wms = | ||
./scripts/r.in.wms/ | ||
${INITIAL_GISBASE-/usr/local/grass??}/etc/r.in.wms/ | ||
/home/*/install/grass??/etc/r.in.wms/ | ||
|
||
|
||
[report] | ||
; Since our file structure isn't an importable package, not all files are found | ||
; This allows to find python files even if there is missing __init__.py files, but is slow | ||
include_namespace_packages = True | ||
skip_covered = False | ||
; Regexes for lines to exclude from consideration | ||
exclude_also = | ||
; Don't complain about missing debug-only code: | ||
def __repr__ | ||
if self\.debug | ||
|
||
; Don't complain if tests don't hit defensive assertion code: | ||
raise AssertionError | ||
raise NotImplementedError | ||
|
||
; Don't complain if non-runnable code isn't run: | ||
; if 0: | ||
; if __name__ == .__main__.: | ||
|
||
; Don't complain about abstract methods, they aren't run: | ||
@(abc\.)?abstractmethod | ||
|
||
ignore_errors = True | ||
precision = 2 | ||
|
||
[html] | ||
directory = coverage_html_report | ||
show_contexts = true |
This file contains 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 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 |
---|---|---|
|
@@ -65,3 +65,5 @@ lib/*/latex/ | |
*.gcno | ||
*.gcda | ||
.coverage | ||
.coverage.* | ||
coverage.xml |
This file contains 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 |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import os | ||
import subprocess | ||
from pathlib import Path | ||
|
||
|
||
def get_grass_config_path(): | ||
grass_config_path = None | ||
try: | ||
grass_config_path = subprocess.run( | ||
["grass", "--config", "path"], capture_output=True, text=True, check=True | ||
).stdout.rstrip() | ||
except OSError: | ||
grass_config_path = None | ||
return grass_config_path | ||
|
||
|
||
INITIAL_GISBASE = os.getenv("INITIAL_GISBASE", get_grass_config_path()) | ||
INITIAL_PWD = os.getenv("INITIAL_PWD", str(Path.cwd().absolute())) | ||
|
||
|
||
def map_scripts_paths(old_path): | ||
if INITIAL_GISBASE is None or INITIAL_PWD is None: | ||
return old_path | ||
p = Path(old_path) | ||
temporal_base = Path(INITIAL_GISBASE) / "scripts" / "t.*" | ||
base = Path(INITIAL_GISBASE) / "scripts" / "*" | ||
if p.match(str(temporal_base)): | ||
return str(Path(INITIAL_PWD) / "temporal" / (p.name) / (p.name)) + ".py" | ||
if p.match(str(base)): | ||
return str(Path(INITIAL_PWD) / "scripts" / (p.name) / (p.name)) + ".py" | ||
|
||
return old_path | ||
|
||
|
||
if __name__ == "__main__": | ||
from coverage import CoverageData | ||
|
||
a = CoverageData(".coverage") | ||
b = CoverageData(".coverage.fixed_scripts") | ||
b.update(a, map_path=map_scripts_paths) | ||
b.write() |