From 3be5237a3b10f43a2b8e0427336832b950c82ddc Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Wed, 14 Aug 2024 13:55:50 +0200 Subject: [PATCH] Update scripts --- bin/verify-exercises | 39 ++++++++++++++++++-------- bin/verify-exercises-in-docker | 50 +++++++++++++++++++++++----------- 2 files changed, 61 insertions(+), 28 deletions(-) diff --git a/bin/verify-exercises b/bin/verify-exercises index ec51048..1ef2628 100755 --- a/bin/verify-exercises +++ b/bin/verify-exercises @@ -1,16 +1,19 @@ #!/usr/bin/env bash # Synopsis: -# Test the track's exercises. +# Verify that each exercise's example/exemplar solution passes the tests. +# You can either verify all exercises or a single exercise. # Example: verify all exercises -# ./bin/verify-exercises +# bin/verify-exercises # Example: verify single exercise -# ./bin/verify-exercises two-fer +# bin/verify-exercises two-fer set -eo pipefail +die() { echo "$*" >&2; exit 1; } + required_tool() { command -v "${1}" >/dev/null 2>&1 || die "${1} is required but not installed. Please install it and make sure it's in your PATH." @@ -20,8 +23,9 @@ required_tool jq required_tool arturo copy_example_or_examplar_to_solution() { - jq -c '[.files.solution, .files.exemplar // .files.example] | transpose | map({src: .[1], dst: .[0]}) | .[]' .meta/config.json | while read -r src_and_dst; do - cp "$(echo "${src_and_dst}" | jq -r '.src')" "$(echo "${src_and_dst}" | jq -r '.dst')" + jq -c '[.files.solution, .files.exemplar // .files.example] | transpose | map({src: .[1], dst: .[0]}) | .[]' .meta/config.json \ + | while read -r src_and_dst; do + cp "$(jq -r '.src' <<< "${src_and_dst}")" "$(jq -r '.dst' <<< "${src_and_dst}")" done } @@ -47,6 +51,7 @@ verify_exercise() { echo "Verifying ${slug} exercise..." ( + trap 'rm -rf "$tmp_dir"' EXIT # remove tempdir when subshell ends cp -r "${dir}/." "${tmp_dir}" cd "${tmp_dir}" @@ -56,11 +61,21 @@ verify_exercise() { ) } -exercise_slug="${1:-*}" +verify_exercises() { + local exercise_slug -shopt -s nullglob -for exercise_dir in ./exercises/{concept,practice}/${exercise_slug}/; do - if [ -d "${exercise_dir}" ]; then - verify_exercise "${exercise_dir}" - fi -done + exercise_slug="${1}" + + shopt -s nullglob + count=0 + for exercise_dir in ./exercises/{concept,practice}/${exercise_slug}/; do + if [[ -d "${exercise_dir}" ]]; then + verify_exercise "${exercise_dir}" + ((++count)) + fi + done + ((count > 0)) || die 'no matching exercises found!' +} + +exercise_slug="${1:-*}" +verify_exercises "${exercise_slug}" diff --git a/bin/verify-exercises-in-docker b/bin/verify-exercises-in-docker index 4b2bd3d..f2ebbab 100755 --- a/bin/verify-exercises-in-docker +++ b/bin/verify-exercises-in-docker @@ -1,16 +1,20 @@ #!/usr/bin/env bash # Synopsis: -# Test the track's exercises. +# Verify that each exercise's example/exemplar solution passes the tests +# using the track's test runner Docker image. +# You can either verify all exercises or a single exercise. -# Example: verify all exercises -# ./bin/verify-exercises-in-docker +# Example: verify all exercises in Docker +# bin/verify-exercises-in-docker -# Example: verify single exercise -# ./bin/verify-exercises-in-docker two-fer +# Example: verify single exercise in Docker +# bin/verify-exercises-in-docker two-fer set -eo pipefail +die() { echo "$*" >&2; exit 1; } + required_tool() { command -v "${1}" >/dev/null 2>&1 || die "${1} is required but not installed. Please install it and make sure it's in your PATH." @@ -19,11 +23,16 @@ required_tool() { required_tool docker copy_example_or_examplar_to_solution() { - jq -c '[.files.solution, .files.exemplar // .files.example] | transpose | map({src: .[1], dst: .[0]}) | .[]' .meta/config.json | while read -r src_and_dst; do - cp "$(echo "${src_and_dst}" | jq -r '.src')" "$(echo "${src_and_dst}" | jq -r '.dst')" + jq -c '[.files.solution, .files.exemplar // .files.example] | transpose | map({src: .[1], dst: .[0]}) | .[]' .meta/config.json \ + | while read -r src_and_dst; do + cp "$(jq -r '.src' <<< "${src_and_dst}")" "$(jq -r '.dst' <<< "${src_and_dst}")" done } +pull_docker_image() { + docker pull exercism/arturo-test-runner +} + run_tests() { local slug slug="${1}" @@ -43,7 +52,6 @@ verify_exercise() { local dir local slug local tmp_dir - dir=$(realpath "${1}") slug=$(basename "${dir}") tmp_dir=$(mktemp -d -t "exercism-verify-${slug}-XXXXX") @@ -51,6 +59,7 @@ verify_exercise() { echo "Verifying ${slug} exercise..." ( + trap 'rm -rf "$tmp_dir"' EXIT # remove tempdir when subshell ends cp -r "${dir}/." "${tmp_dir}" cd "${tmp_dir}" @@ -59,13 +68,22 @@ verify_exercise() { ) } -exercise_slug="${1:-*}" +verify_exercises() { + local exercise_slug + exercise_slug="${1}" + + shopt -s nullglob + count=0 + for exercise_dir in ./exercises/{concept,practice}/${exercise_slug}/; do + if [[ -d "${exercise_dir}" ]]; then + verify_exercise "${exercise_dir}" + ((++count)) + fi + done + ((count > 0)) || die 'no matching exercises found!' +} -docker pull exercism/arturo-test-runner +pull_docker_image -shopt -s nullglob -for exercise_dir in ./exercises/{concept,practice}/${exercise_slug}/; do - if [ -d "${exercise_dir}" ]; then - verify_exercise "${exercise_dir}" - fi -done +exercise_slug="${1:-*}" +verify_exercises "${exercise_slug}"