summaryrefslogtreecommitdiffstats
path: root/src/etc/htmldocck.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/etc/htmldocck.py')
-rwxr-xr-x[-rw-r--r--]src/etc/htmldocck.py62
1 files changed, 56 insertions, 6 deletions
diff --git a/src/etc/htmldocck.py b/src/etc/htmldocck.py
index c97fb4b80..5ab1874e9 100644..100755
--- a/src/etc/htmldocck.py
+++ b/src/etc/htmldocck.py
@@ -110,6 +110,9 @@ There are a number of supported commands:
* `@has-dir PATH` checks for the existence of the given directory.
+* `@files FOLDER_PATH [ENTRIES]`, checks that `FOLDER_PATH` contains exactly
+ `[ENTRIES]`.
+
All conditions can be negated with `!`. `@!has foo/type.NoSuch.html`
checks if the given file does not exist, for example.
@@ -144,7 +147,7 @@ VOID_ELEMENTS = {'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'ke
# Python 2 -> 3 compatibility
try:
- unichr
+ unichr # noqa: B018 FIXME: py2
except NameError:
unichr = chr
@@ -321,12 +324,15 @@ class CachedFiles(object):
else:
return self.last_path
+ def get_absolute_path(self, path):
+ return os.path.join(self.root, path)
+
def get_file(self, path):
path = self.resolve_path(path)
if path in self.files:
return self.files[path]
- abspath = os.path.join(self.root, path)
+ abspath = self.get_absolute_path(path)
if not(os.path.exists(abspath) and os.path.isfile(abspath)):
raise FailedCheck('File does not exist {!r}'.format(path))
@@ -340,7 +346,7 @@ class CachedFiles(object):
if path in self.trees:
return self.trees[path]
- abspath = os.path.join(self.root, path)
+ abspath = self.get_absolute_path(path)
if not(os.path.exists(abspath) and os.path.isfile(abspath)):
raise FailedCheck('File does not exist {!r}'.format(path))
@@ -348,13 +354,15 @@ class CachedFiles(object):
try:
tree = ET.fromstringlist(f.readlines(), CustomHTMLParser())
except Exception as e:
- raise RuntimeError('Cannot parse an HTML file {!r}: {}'.format(path, e))
+ raise RuntimeError( # noqa: B904 FIXME: py2
+ 'Cannot parse an HTML file {!r}: {}'.format(path, e)
+ )
self.trees[path] = tree
return self.trees[path]
def get_dir(self, path):
path = self.resolve_path(path)
- abspath = os.path.join(self.root, path)
+ abspath = self.get_absolute_path(path)
if not(os.path.exists(abspath) and os.path.isdir(abspath)):
raise FailedCheck('Directory does not exist {!r}'.format(path))
@@ -422,7 +430,7 @@ def check_snapshot(snapshot_name, actual_tree, normalize_to_text):
if bless:
expected_str = None
else:
- raise FailedCheck('No saved snapshot value')
+ raise FailedCheck('No saved snapshot value') # noqa: B904 FIXME: py2
if not normalize_to_text:
actual_str = ET.tostring(actual_tree).decode('utf-8')
@@ -536,6 +544,41 @@ def get_nb_matching_elements(cache, c, regexp, stop_at_first):
return check_tree_text(cache.get_tree(c.args[0]), pat, c.args[2], regexp, stop_at_first)
+def check_files_in_folder(c, cache, folder, files):
+ files = files.strip()
+ if not files.startswith('[') or not files.endswith(']'):
+ raise InvalidCheck("Expected list as second argument of @{} (ie '[]')".format(c.cmd))
+
+ folder = cache.get_absolute_path(folder)
+
+ # First we create a set of files to check if there are duplicates.
+ files = shlex.split(files[1:-1].replace(",", ""))
+ files_set = set()
+ for file in files:
+ if file in files_set:
+ raise InvalidCheck("Duplicated file `{}` in @{}".format(file, c.cmd))
+ files_set.add(file)
+ folder_set = set([f for f in os.listdir(folder) if f != "." and f != ".."])
+
+ # Then we remove entries from both sets (we clone `folder_set` so we can iterate it while
+ # removing its elements).
+ for entry in set(folder_set):
+ if entry in files_set:
+ files_set.remove(entry)
+ folder_set.remove(entry)
+
+ error = 0
+ if len(files_set) != 0:
+ print_err(c.lineno, c.context, "Entries not found in folder `{}`: `{}`".format(
+ folder, files_set))
+ error += 1
+ if len(folder_set) != 0:
+ print_err(c.lineno, c.context, "Extra entries in folder `{}`: `{}`".format(
+ folder, folder_set))
+ error += 1
+ return error == 0
+
+
ERR_COUNT = 0
@@ -564,6 +607,13 @@ def check_command(c, cache):
else:
raise InvalidCheck('Invalid number of @{} arguments'.format(c.cmd))
+ elif c.cmd == 'files': # check files in given folder
+ if len(c.args) != 2: # @files <folder path> <file list>
+ raise InvalidCheck("Invalid number of @{} arguments".format(c.cmd))
+ elif c.negated:
+ raise InvalidCheck("@{} doesn't support negative check".format(c.cmd))
+ ret = check_files_in_folder(c, cache, c.args[0], c.args[1])
+
elif c.cmd == 'count': # count test
if len(c.args) == 3: # @count <path> <pat> <count> = count test
expected = int(c.args[2])