#!/usr/bin/env python3
# $Id: test_buildhtml.py 9906 2024-08-15 08:43:38Z grubert $
# Author: engelbert gruber
# Copyright: This module has been placed in the public domain.
"""
test buildhtml options, because ``--local`` is broken.
Build-HTML Options
------------------
--recurse Recursively scan subdirectories for files to process.
This is the default.
--local Do not scan subdirectories for files to process.
--prune= Do not process files in . This option may
be used more than once to specify multiple
directories.
--ignore= Recursively ignore files or directories matching any
of the given wildcard (shell globbing) patterns
(separated by colons). Default: ".svn:CVS"
--silent Work silently (no progress messages). Independent of
"--quiet".
"""
from __future__ import annotations
import shutil
import subprocess
import sys
import tempfile
import unittest
from pathlib import Path
# TOOLS_ROOT is ./tools/ from the docutils root
TOOLS_ROOT = Path(__file__).resolve().parent.parent
BUILDHTML_PATH = TOOLS_ROOT / 'buildhtml.py'
def process_and_return_filelist(
options: list[str],
) -> tuple[list[str], list[str]]:
dirs = []
files = []
ret = subprocess.run(
[sys.executable, BUILDHTML_PATH] + options,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
encoding='utf-8',
errors='replace',
)
for line in ret.stdout.splitlines():
# BUG no colon in filename/path allowed
item = line.split(": ")[-1].strip()
if line.startswith(" "):
files.append(item)
else:
dirs.append(item)
return dirs, files
class BuildHtmlTests(unittest.TestCase):
tree = (
"_tmp_test_tree/one.rst",
"_tmp_test_tree/two.rst",
"_tmp_test_tree/dir1/one.rst",
"_tmp_test_tree/dir1/two.rst",
"_tmp_test_tree/dir2/one.rst",
"_tmp_test_tree/dir2/two.rst",
"_tmp_test_tree/dir2/sub/one.rst",
"_tmp_test_tree/dir2/sub/two.rst",
)
def setUp(self) -> None:
self.root = Path(tempfile.mkdtemp()).resolve()
for file in self.tree:
path = self.root / file
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text('dummy', encoding='utf-8')
def tearDown(self) -> None:
shutil.rmtree(self.root)
def test_1(self) -> None:
opts = ["--dry-run", str(self.root)]
_dirs, files = process_and_return_filelist(opts)
self.assertEqual(files.count("one.rst"), 4)
def test_local(self) -> None:
opts = ["--dry-run", "--local", str(self.root)]
dirs, files = process_and_return_filelist(opts)
self.assertEqual(len(dirs), 1)
self.assertEqual(files, [])
if __name__ == '__main__':
unittest.main()