Module manubot.tests.test_readme
View Source
import pathlib
import re
import shlex
import subprocess
import sys
import pytest
readme_path = pathlib.Path(__file__).parent.parent.parent / "README.md"
readme = readme_path.read_text(encoding="utf-8-sig")
template = r"""
<!-- test codeblock contains output of `{command}` -->
```
{output}```
"""
pattern = template.format(command=r"(?P<command>.+?)", output=r"(?P<output>.+?)")
pattern = re.compile(pattern, re.DOTALL)
matches = list(pattern.finditer(readme))
@pytest.mark.parametrize(
argnames=["command", "expected"],
argvalues=[match.groups() for match in matches],
ids=[match.group("command") for match in matches],
)
@pytest.mark.skipif(
sys.version_info < (3, 10),
reason="Python 3.10 changed 'optional arguments' to 'options' in argparse usage output.",
)
def test_readme_codeblock_contains_output_from(command, expected):
"""
If this test fails, ensure that codeblocks in README.md have the correct
output. To enable this check for output in a codeblock, use the following
construct:
<!-- test codeblock contains output of `{command}` -->
```
{expected}
```
"""
output = _get_output_from(command)
assert output == expected
def _get_output_from(command):
return subprocess.check_output(shlex.split(command), encoding="utf-8")
def _match_to_repl(match):
template_dict = match.groupdict()
template_dict["output"] = _get_output_from(template_dict["command"])
return template.format(**template_dict)
if __name__ == "__main__":
"""
Run `python manubot/tests/test_readme.py` to populate README
codeblocks with output from the specified commands.
"""
repl_readme = pattern.sub(repl=_match_to_repl, string=readme)
readme_path.write_text(repl_readme, encoding="utf-8")
Variables
matches
pattern
readme
readme_path
template
Functions
test_readme_codeblock_contains_output_from
def test_readme_codeblock_contains_output_from(
command,
expected
)
If this test fails, ensure that codeblocks in README.md have the correct
output. To enable this check for output in a codeblock, use the following construct:
{expected}
View Source
@pytest.mark.parametrize(
argnames=["command", "expected"],
argvalues=[match.groups() for match in matches],
ids=[match.group("command") for match in matches],
)
@pytest.mark.skipif(
sys.version_info < (3, 10),
reason="Python 3.10 changed 'optional arguments' to 'options' in argparse usage output.",
)
def test_readme_codeblock_contains_output_from(command, expected):
"""
If this test fails, ensure that codeblocks in README.md have the correct
output. To enable this check for output in a codeblock, use the following
construct:
<!-- test codeblock contains output of `{command}` -->
```
{expected}
```
"""
output = _get_output_from(command)
assert output == expected