mirror of
https://github.com/saltstack/salt.git
synced 2025-04-16 17:50:20 +00:00
91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
"""
|
|
`tests/filename_map.yml` validity checks
|
|
"""
|
|
import pathlib
|
|
import re
|
|
|
|
import yaml
|
|
from ptscripts import Context, command_group
|
|
|
|
import tools.utils
|
|
|
|
FILENAME_MAP_PATH = tools.utils.REPO_ROOT / "tests" / "filename_map.yml"
|
|
|
|
cgroup = command_group(name="filemap", help=__doc__, parent="pre-commit")
|
|
|
|
|
|
def _match_to_test_file(match: str) -> pathlib.Path:
|
|
tests_path = tools.utils.REPO_ROOT / "tests"
|
|
parts = match.split(".")
|
|
parts[-1] += ".py"
|
|
return tests_path.joinpath(*parts).relative_to(tools.utils.REPO_ROOT)
|
|
|
|
|
|
def _check_matches(ctx: Context, rule: str, matches: list[str]) -> int:
|
|
errors = 0
|
|
for match in matches:
|
|
filematch = _match_to_test_file(match)
|
|
if not filematch.exists():
|
|
ctx.error(
|
|
f"The match '{match}' for rule '{rule}' points to a non "
|
|
f"existing test module path: {filematch}"
|
|
)
|
|
errors += 1
|
|
return errors
|
|
|
|
|
|
@cgroup.command(
|
|
name="check",
|
|
)
|
|
def check(ctx: Context) -> None:
|
|
exitcode = 0
|
|
excludes = ("tools/", "templates/", ".nox/")
|
|
full_filelist = [
|
|
path.relative_to(tools.utils.REPO_ROOT)
|
|
for path in tools.utils.REPO_ROOT.rglob("*.py")
|
|
]
|
|
filelist = [
|
|
str(path) for path in full_filelist if not str(path).startswith(excludes)
|
|
]
|
|
filename_map = yaml.safe_load(FILENAME_MAP_PATH.read_text())
|
|
for rule, matches in filename_map.items():
|
|
if rule == "*":
|
|
exitcode += _check_matches(ctx, rule, matches)
|
|
elif "|" in rule:
|
|
# This is regex
|
|
for filepath in filelist:
|
|
if re.match(rule, filepath):
|
|
# Found at least one match, stop looking
|
|
break
|
|
else:
|
|
ctx.error(
|
|
f"Could not find a matching file in the salt repo for the rule '{rule}'"
|
|
)
|
|
exitcode += 1
|
|
continue
|
|
exitcode += _check_matches(ctx, rule, matches)
|
|
elif "*" in rule or "\\" in rule:
|
|
# Glob matching
|
|
process_matches = True
|
|
for filerule in tools.utils.REPO_ROOT.glob(rule):
|
|
if not filerule.exists():
|
|
ctx.error(
|
|
f"The rule '{rule}' points to a non existing path: {filerule}"
|
|
)
|
|
exitcode += 1
|
|
process_matches = False
|
|
if process_matches:
|
|
exitcode += _check_matches(ctx, rule, matches)
|
|
else:
|
|
# Direct file paths as rules
|
|
filerule = pathlib.Path(rule)
|
|
if not filerule.exists():
|
|
ctx.error(
|
|
f"The rule '{rule}' points to a non existing path: {filerule}"
|
|
)
|
|
exitcode += 1
|
|
continue
|
|
exitcode += _check_matches(ctx, rule, matches)
|
|
if exitcode:
|
|
ctx.error(f"Found {exitcode} errors")
|
|
ctx.exit(exitcode)
|