diff options
author | Lars Wirzenius <liw@liw.fi> | 2020-04-22 10:25:58 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2020-04-22 10:50:01 +0300 |
commit | 18d2dd3b0094d373a4632c9c444d7a2267cc9164 (patch) | |
tree | 09487a98c0c7a8afacc053fec63fb3e627e26019 /templates | |
parent | e50ca0c984173ce8d84d6a4092096753512ccf26 (diff) | |
download | subplot-18d2dd3b0094d373a4632c9c444d7a2267cc9164.tar.gz |
Add: a bash template and change echo.md to use it
Diffstat (limited to 'templates')
-rw-r--r-- | templates/bash/template.sh | 195 | ||||
-rw-r--r-- | templates/bash/template.yaml | 2 |
2 files changed, 197 insertions, 0 deletions
diff --git a/templates/bash/template.sh b/templates/bash/template.sh new file mode 100644 index 0000000..92cb1b7 --- /dev/null +++ b/templates/bash/template.sh @@ -0,0 +1,195 @@ +#!/bin/bash + +set -eu -o pipefail + +############################################################################# +# Functions that implement steps. From {{ functions_filename }}. + +{{ functions }} + + +############################################################################# +# Helper code generated by Subplot. + + +# Simple dictionary abstraction. All values are stored in files so +# they can more easily be inspected. + +dict_new() { + local name="$1" + rm -rf "$name" + mkdir "$name" +} + +dict_has() { + local name="$1" + local key="$2" + local f="$name/$key" + test -e "$f" +} + +dict_get() { + local name="$1" + local key="$2" + local f="$name/$key" + cat "$f" +} + +dict_get_default() { + local name="$1" + local key="$2" + local default="$3" + local f="$name/$key" + if [ -e "$f" ] + then + cat "$f" + else + echo "$default" + fi +} + +dict_set() { + local name="$1" + local key="$2" + local value="$3" + local f="$name/$key" + echo "$value" > "$f" +} + +dict_keys() { + local name="$1" + ls -1 "$name" +} + + +# A context abstraction using dictionaries. + +ctx_new() { + dict_new _ctx +} + +ctx_set() +{ + dict_set _ctx "$1" "$2" +} + +ctx_get() +{ + dict_get _ctx "$1" +} + + +# Store step captures for calling the corresponding functions. + +cap_new() { + dict_new _cap +} + +cap_set() +{ + dict_set _cap "$1" "$2" +} + +cap_get() +{ + dict_get _cap "$1" +} + + +# Store files embedded in the markdown input. + +files_new() { + dict_new _files +} + +files_set() { + dict_set _files "$1" "$2" +} + +files_get() { + dict_get _files "$1" +} + + +# Decode a base64 encoded string. + +decode_base64() { + echo "$1" | base64 -d +} + +# Check two values for equality and give error if they are not equal +assert_eq() { + if ! diff -u <(echo "$1") <(echo "$2") + then + echo "expected values to be identical, but they're not" + exit 1 + fi +} + +# Check first value contains second value. +assert_contains() { + if ! echo "$1" | grep -F "$2" > /dev/null + then + echo "expected first value to contain second value" + exit 1 + fi +} + +# Remember where we started from. The step functions may need to refer +# to files there. +srcdir="$(pwd)" +echo "srcdir $srcdir" + +# Create a new temporary directory and chdir there. This allows step +# functions to create new files in the current working directory +# without having to be so careful. +_datadir="$(mktemp -d)" +echo "datadir $_datadir" +cd "$_datadir" + + +# Store test data files that were embedded in the source document. +# Base64 encoding is used to allow arbitrary data. + +files_new +{% for file in files %} +# {{ file.filename }} +filename="$(decode_base64 '{{ file.filename | base64 }}')" +contents="$(decode_base64 '{{ file.contents | base64 }}')" +files_set "$filename" "$contents" +{% endfor %} + + +############################################################################# +# Code to implement the scenarios. + +{% for scenario in scenarios %} +###################################### +# Scenario: {{ scenario.title }} +title="$(decode_base64 '{{ scenario.title | base64 }}')" +echo "scenario: $title" +_scendir="$(mktemp -d -p "$_datadir")" +cd "$_scendir" +ctx_new +{% for step in scenario.steps %} +# Step: {{ step.text }} +step="$(decode_base64 '{{ step.text | base64 }}')" +echo " step: {{ step.kind | lower }} $step" + +cap_new +{% for part in step.parts %}{% if part.CapturedText is defined -%} +name="$(decode_base64 '{{ part.CapturedText.name | base64 }}')" +text="$(decode_base64 '{{ part.CapturedText.text | base64 }}')" +cap_set "$name" "$text" +{% endif -%} +{% endfor -%} +{{ step.function }} +{% endfor %} +{% endfor %} + + +############################################################################# +# Clean up temporary directory and report success. + +rm -rf "$_datadir" +echo "OK, all scenarios finished successfully" diff --git a/templates/bash/template.yaml b/templates/bash/template.yaml new file mode 100644 index 0000000..b542a06 --- /dev/null +++ b/templates/bash/template.yaml @@ -0,0 +1,2 @@ +template: template.sh +run: bash |