Keeping documentation updated is tedious and error prone. Particularly documentation that contain actual commands or e.g. configuration data. General documentation can be high-level and thus remain correct even when changes are being implemented, but actual commands or configuration data cannot - it must be correct as documented.
This tool allows for extraction of code blocks from Markdown documentation into shell-scripts that can be exercised in automated tests and thus provide an indication of documentation correctness.
Imagine the following example with three code blocks. One that sets environment variables:
export FOO=hello
export BAR=world
One that prints an output based on the variables:
echo "$FOO, $BAR"
And finally the expected output:
hello, world
We can automate testing of this documentation using the
markdown2bash
tool. First extract code blocks:
export IMAGE_VERSION=0.0.2
cat README.md | docker run --rm -i ghcr.io/michaelvl/markdown2bash:$IMAGE_VERSION > readme.sh
This will generate a shell script that e.g. includes the first code block both as a function and a variable:
read -r -d '' _v_getting_started_0001 <<'EOF_5577006791947779410'
export FOO=hello
export BAR=world
EOF_5577006791947779410
_f_getting_started_0001() {
export FOO=hello
export BAR=world
}
Note how the function/variable names are constructed from the
lower-case version of the Headers (getting_started
) in the markdown,
followed by an incremented id (0001
) to handle multiple code blocks
per heading and function names start with a _f_
prefix and variables
with _v_
.
From these function and variable definitions, we can construct tests
that use the actual code from markdown documentation. See
test/readme-example-test.sh for an
example that test the code blocks above. See also the GitHub action
e2e-tests.yaml for how
markdown2bash
is used to test the code blocks above.