Add task to check tests/filename_map.yml validity

This commit is contained in:
Pedro Algarvio 2020-05-19 09:47:45 +01:00 committed by Daniel Wozniak
parent 74a744a57e
commit e6e1ab3ef6
9 changed files with 116 additions and 1 deletions

View file

@ -638,3 +638,17 @@ repos:
- invoke-pre-commit
- --
- docs.check
- repo: https://github.com/saltstack/salt-nox-pre-commit
rev: master
hooks:
- id: nox-py2
alias: check-filemap
name: Check Filename Map Change Matching
files: ^tests/filename_map\.yml$
pass_filenames: false
args:
- -e
- invoke-pre-commit
- --
- filemap.check

View file

@ -1,2 +1,3 @@
invoke
blessings
pyyaml

View file

@ -6,4 +6,5 @@
#
blessings==1.7
invoke==1.4.1
pyyaml==5.3.1
six==1.14.0 # via blessings

View file

@ -6,4 +6,5 @@
#
blessings==1.7
invoke==1.4.1
pyyaml==5.3.1
six==1.14.0 # via blessings

View file

@ -6,4 +6,5 @@
#
blessings==1.7
invoke==1.4.1
pyyaml==5.3.1
six==1.14.0 # via blessings

View file

@ -6,4 +6,5 @@
#
blessings==1.7
invoke==1.4.1
pyyaml==5.3.1
six==1.14.0 # via blessings

View file

@ -6,4 +6,5 @@
#
blessings==1.7
invoke==1.4.1
pyyaml==5.3.1
six==1.14.0 # via blessings

View file

@ -2,8 +2,9 @@
from invoke import Collection # pylint: disable=3rd-party-module-not-gated
from . import docs, loader
from . import docs, filemap, loader
ns = Collection()
ns.add_collection(Collection.from_module(docs, name="docs"), name="docs")
ns.add_collection(Collection.from_module(loader, name="loader"), name="loader")
ns.add_collection(Collection.from_module(filemap, name="filemap"), name="filemap")

94
tasks/filemap.py Normal file
View file

@ -0,0 +1,94 @@
# -*- coding: utf-8 -*-
"""
tasks.filemap
~~~~~~~~~~~~~
tests/filename_map.yml validity checks
"""
import pathlib
import re
import yaml
from invoke import task # pylint: disable=3rd-party-module-not-gated
from tasks import utils
CODE_DIR = pathlib.Path(__file__).resolve().parent.parent
FILENAME_MAP_PATH = CODE_DIR / "tests" / "filename_map.yml"
def _match_to_test_file(match):
tests_path = CODE_DIR / "tests"
parts = match.split(".")
parts[-1] += ".py"
return tests_path.joinpath(*parts).relative_to(CODE_DIR)
def _check_matches(rule, matches):
errors = 0
for match in matches:
filematch = _match_to_test_file(match)
if not filematch.exists():
utils.error(
"The match '{}' for rule '{}' points to a non existing test module path: {}",
match,
rule,
filematch,
)
errors += 1
return errors
@task
def check(ctx):
exitcode = 0
excludes = ("tasks/", "templates/", ".nox/")
full_filelist = [path.relative_to(CODE_DIR) for path in CODE_DIR.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())
checked = set()
for rule, matches in filename_map.items():
if rule == "*":
exitcode += _check_matches(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:
utils.error(
"Could not find a matching file in the salt repo for the rule '{}'",
rule,
)
exitcode += 1
continue
exitcode += _check_matches(rule, matches)
elif "*" in rule or "\\" in rule:
# Glob matching
process_matches = True
for filerule in CODE_DIR.glob(rule):
if not filerule.exists():
utils.error(
"The rule '{}' points to a non existing path: {}",
rule,
filerule,
)
exitcode += 1
process_matches = False
if process_matches:
exitcode += _check_matches(rule, matches)
else:
# Direct file paths as rules
filerule = pathlib.Path(rule)
if not filerule.exists():
utils.error(
"The rule '{}' points to a non existing path: {}", rule, filerule
)
exitcode += 1
continue
exitcode += _check_matches(rule, matches)
if exitcode:
utils.error("Found {} errors", exitcode)
utils.exit_invoke(exitcode)